Ich arbeite jetzt schon eine Weile an einem Java-Projekt für eine Klasse. Es ist eine Implementierung einer verknüpften Liste (hier genannt AddressList
, die einfache Knoten enthält ListNode
). Der Haken ist, dass alles mit rekursiven Algorithmen gemacht werden müsste. Ich konnte alles gut machen ohne eine Methode:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
Im Moment reverse
ruft meine Funktion nur eine Hilfsfunktion auf, die ein Argument verwendet, um eine Rekursion zu ermöglichen.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
Mit meiner Hilfsfunktion mit der Signatur von private ListNode reverse(ListNode current)
.
Im Moment funktioniert es iterativ mit einem Stapel, aber dies ist nicht das, was die Spezifikation erfordert. Ich hatte in C einen Algorithmus gefunden, der ihn rekursiv umkehrte und von Hand in Java-Code konvertierte, und er funktionierte, aber ich hatte kein Verständnis dafür.
Edit: Nevermind, ich habe es in der Zwischenzeit herausgefunden.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Hat jemand Probleme mit dieser Route, während ich hier bin?
quelle
Antworten:
In einer Antwort ist Code enthalten, der es ausdrückt, aber es ist möglicherweise einfacher, von unten nach oben zu beginnen, indem Sie winzige Fragen stellen und beantworten (dies ist der Ansatz in The Little Lisper):
quelle
Diese Frage wurde mir bei einem Interview gestellt und ich war verärgert, dass ich damit herumgefummelt habe, da ich etwas nervös war.
Dies sollte eine einfach verknüpfte Liste umkehren, die mit reverse (head, NULL) aufgerufen wird. Also, wenn dies Ihre Liste wäre:
edit: Ich habe 6 Änderungen daran vorgenommen, was zeigt, dass es für mich immer noch etwas schwierig ist, lol
quelle
Ich bin auf halbem Weg durchgekommen (bis null und ein Knoten, wie vom Sockel vorgeschlagen), habe aber nach einem rekursiven Aufruf den Überblick verloren. Nachdem ich den Beitrag auf dem Sockel gelesen habe, habe ich mir Folgendes ausgedacht:
quelle
Hier ist noch eine andere rekursive Lösung. Die rekursive Funktion enthält weniger Code als einige der anderen, daher ist sie möglicherweise etwas schneller. Dies ist C #, aber ich glaube, Java wäre sehr ähnlich.
quelle
Das Algo muss am folgenden Modell arbeiten:
Struktur:
Code:
Ausgabe:
quelle
Ich denke, dies ist eine sauberere Lösung, die LISP ähnelt
quelle
Ich weiß, dass dies ein alter Beitrag ist, aber die meisten Antworten sind nicht rekursiv, dh sie führen einige Operationen nach der Rückkehr vom rekursiven Aufruf aus und sind daher nicht die effizientesten.
Hier ist eine rekursive Schwanzversion:
Rufen Sie an mit:
quelle
quelle
quelle
quelle
quelle
Umkehrung durch rekursives Algo.
Durch iterative
quelle
Diese Lösung zeigt, dass keine Argumente erforderlich sind.
Hier ist der unterstützende Code, um zu demonstrieren, dass dies funktioniert:
quelle
Hier ist ein einfacher iterativer Ansatz:
Und hier ist ein rekursiver Ansatz:
quelle
Da Java immer als Wert übergeben wird, müssen Sie zum rekursiven Umkehren einer verknüpften Liste in Java am Ende der Rekursion den "neuen Kopf" (den Kopfknoten nach der Umkehrung) zurückgeben.
quelle
PointZeroTwo hat eine elegante Antwort und das gleiche in Java ...
quelle
quelle
Aufruf mit: head = reverseRec (null, head);
quelle
Was andere Leute getan haben, in einem anderen Beitrag ist ein Spiel mit Inhalten, was ich getan habe, ist ein Spiel mit verknüpfter Liste, es kehrt das Mitglied der LinkedList um, nicht umgekehrt einen Wert von Mitgliedern.
quelle
quelle
Die Lösung ist:
}}
quelle
quelle
quelle
quelle
quelle
Inspiriert von einem Artikel über unveränderliche Implementierungen rekursiver Datenstrukturen habe ich mit Swift eine alternative Lösung zusammengestellt.
Die führende Lösung für Antwortdokumente mit Hervorhebung der folgenden Themen:
Ich habe diese gegebenenfalls in der folgenden Lösung genannt.
quelle
Umkehren der verknüpften Liste mithilfe der Rekursion. Die Idee ist, die Links durch Umkehren der Links anzupassen.
quelle
quelle
quelle
Hier ist eine Referenz, wenn jemand nach einer Scala-Implementierung sucht:
quelle