Od jakiegoś czasu pracuję nad projektem Java dla klasy. Jest to implementacja połączonej listy (nazywanej tutaj AddressList
, zawierającej zwane proste węzły ListNode
). Haczyk polega na tym, że wszystko musiałoby być zrobione za pomocą algorytmów rekurencyjnych. Udało mi się zrobić wszystko dobrze bez jednej metody:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
W tej chwili moja reverse
funkcja po prostu wywołuje funkcję pomocniczą, która przyjmuje argument, aby zezwolić na rekursję.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Dzięki mojej funkcji pomocniczej posiadającej podpis private ListNode reverse(ListNode current)
.
W tej chwili pracuję iteracyjnie ze stosem, ale nie tego wymaga specyfikacja. Znalazłem algorytm w C, który rekurencyjnie odwracał go i ręcznie konwertował na kod Java, i działał, ale nie rozumiałem tego.
Edycja: nieważne, w międzyczasie odkryłem to.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Skoro tu jestem, czy ktoś widzi jakieś problemy z tą trasą?
źródło
Odpowiedzi:
W jednej odpowiedzi znajduje się kod, który to określa, ale może się okazać, że łatwiej będzie zacząć od dołu, zadając drobne pytania i odpowiadając na nie (takie jest podejście w The Little Lisper):
źródło
Zadano mi to pytanie na wywiadzie i byłem zirytowany, że majstrowałem przy nim, ponieważ byłem trochę zdenerwowany.
Powinno to odwrócić pojedynczo połączoną listę o nazwie reverse (head, NULL); więc gdyby to była Twoja lista:
edit: zrobiłem 6 zmian, pokazując, że jest to dla mnie trochę trudne, lol
źródło
Przeszedłem w połowie (do zera i jeden węzeł, jak sugeruje cokół), ale straciłem ścieżkę po wykonaniu połączenia rekurencyjnego. Jednak po przeczytaniu postu przy cokole, oto co wymyśliłem:
źródło
Oto jeszcze jedno rozwiązanie rekurencyjne. Zawiera mniej kodu w ramach funkcji rekurencyjnej niż niektóre inne, więc może być trochę szybszy. To jest C #, ale uważam, że Java byłaby bardzo podobna.
źródło
Algo będzie musiało działać na następującym modelu,
Struktura:
Kod:
Wynik:
źródło
Myślę, że jest to bardziej czystsze rozwiązanie, które przypomina LISP
źródło
Wiem, że to stary post, ale większość odpowiedzi nie jest rekurencyjna, tzn. Wykonują pewne operacje po powrocie z wywołania rekurencyjnego, a zatem nie są najbardziej wydajne.
Oto rekurencyjna wersja ogona:
Zadzwoń z:
źródło
źródło
źródło
źródło
źródło
Odwróć za pomocą rekurencyjnego algo.
Iteracyjnie
źródło
To rozwiązanie pokazuje, że żadne argumenty nie są wymagane.
Oto kod pomocniczy, aby pokazać, że to działa:
źródło
Oto proste podejście iteracyjne:
A oto podejście rekurencyjne:
źródło
Ponieważ Java jest zawsze przekazywana przez wartość, aby rekurencyjnie odwrócić połączoną listę w Javie, upewnij się, że na końcu rekurencji zwracana jest „nowa głowa” (węzeł główny po przywróceniu).
źródło
PointZeroTwo ma elegancką odpowiedź i to samo w Javie ...
źródło
źródło
wywołanie przy użyciu: head = reverseRec (null, head);
źródło
To, co zrobili inni faceci, w innym poście jest grą treści, to, co zrobiłem, to gra z linkowaną listą, która odwraca wartość członków LinkedIn, a nie odwraca wartości członków.
źródło
źródło
Rozwiązaniem jest:
}
źródło
źródło
źródło
źródło
źródło
Zainspirowany artykułem omawiającym niezmienne implementacje rekurencyjnych struktur danych, połączyłem alternatywne rozwiązanie przy użyciu języka Swift.
Wiodące rozwiązanie w zakresie dokumentów z odpowiedziami, podkreślając następujące tematy:
Podałem je tam, gdzie ma to zastosowanie, w rozwiązaniu poniżej.
źródło
Odwracanie połączonej listy za pomocą rekursji. Chodzi o to, aby dostosować linki poprzez odwrócenie linków.
źródło
źródło
źródło
Oto referencja, jeśli ktoś szuka implementacji Scala:
źródło