Rekursiv finden der N-te bis Letzte element in verketteter Liste
Ich bin üben grundlegende Datenstruktur Sachen und ich habe einige Schwierigkeiten mit Rekursion. Ich verstehe, wie zu tun dies durch iteration, aber alle meine versuche, die Rückkehr der N-te Knoten aus dem letzten eine verkettete Liste mittels Rekursion Ergebnis null. Das ist mein code bisher:
public static int i = 0;
public static Link.Node findnthToLastRecursion(Link.Node node, int pos) {
if(node == null) return null;
else{
findnthToLastRecursion(node.next(), pos);
if(++i == pos) return node;
return null;
}
Kann mir jemand helfen, zu verstehen, wo ich bin läuft hier falsch?
Dies ist mein iterative Lösung, welche gut funktioniert, aber ich würde wirklich gerne wissen, wie übersetzt man dies in die Rekursion:
public static Link.Node findnthToLast(Link.Node head, int n) {
if (n < 1 || head == null) {
return null;
}
Link.Node pntr1 = head, pntr2 = head;
for (int i = 0; i < n - 1; i++) {
if (pntr2 == null) {
return null;
} else {
pntr2 = pntr2.next();
}
}
while (pntr2.next() != null) {
pntr1 = pntr1.next();
pntr2 = pntr2.next();
}
return pntr1;
}
- Was ist der Wert von
node
beim ersten Aufruf - und arbeiten Sie sich vorwärts oder rückwärts? Ich hätte gedacht, dass Sie brauchen, um zu starten am Ende und rufenprevious()
oder wenn Sie nicht wissen, was das Ende ist, am Anfang beginnen, arbeiten Sie Ihren Weg bis zum Ende, dann wieder rausn
Zeiten. Dieser code tut nichts, wie die... - Wie Sie wissen, die letzten N-TEN Knoten, wenn Sie nicht finden, wo der Letzte Knoten ist (oder die Größe)? Diese (wenn richtig geschrieben) finden die N - 1 Knoten (nicht die x-te Letzte Knoten)
- kurze Frage: wissen Sie, was die Länge der verketteten Liste, ist
- Der erste Wert ist der Kopf, und es gibt keine früheren () - Funktion aufrufen. Am Anfang, arbeiten, Weg, zu Ende, dann zieht sich n-mal macht Sinn für mich, durch iteration, aber ich kann einfach nicht scheinen zu wickeln meinem Kopf auf, wie zu tun, dass rekursiv.
- In diesem Fall weiß ich die Länge, aber ich versuche, es zu schreiben, unter der Annahme, dass die Länge unbekannt ist.
- ich persönlich glaube nicht, dass es eine gute Möglichkeit, dies zu tun rekursiv. Ja, es gibt Möglichkeiten, aber keiner von Ihnen sind gut
- der zurückgegebene Knoten aus, wenn ich und pos sind gleich, ist nie wieder in den stack. Siehe meine Antwort unten.
- So Stelle ich mir vor Sie erhalten eine Liste der Elemente, wenn Sie es passieren
findnthToLast(lst, 1)
aber nach der iterativen Lösung haben Sie die for-Schleife wird verlassen, da der test0 < 1-1
wird nicht passieren. Ist das ein Fehler? - Hm, gut zu fangen. Ich habe switch zu testen, mit 1, und es ist Rückkehr die richtige. Eigentlich bin ich ein bisschen verwirrt, warum jetzt. . .
- Ich habe funktioniert, weil Sie nicht überprüfen
pntr2 != null
aberpntr2.next()
🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie bis zum Ende zu gehen und dann zählen Sie Ihre Weise zurück, stellen Sie sicher, pass zurück, den Knoten jedes mal, wenn Ihr wieder vergangen. Ich mag eine Rückkehr Punkt
Beispiel arbeiten Ausgänge 7 als 2 Weg von der 9. und letzten Knoten:
static int i
. Diese kann getan werden, ohne statische Variablen: stackoverflow.com/a/29937328/885464Keine Notwendigkeit für statische Variablen.
Ich falsch verstanden, die Frage. Hier ist eine Antwort, basierend auf Ihren iterative Lösung:
Können Sie dies tun, ein paar Möglichkeiten:
verwenden Sie einen auxiliary-Struktur zu halten, das Ergebnis plus die restliche Länge; dies ersetzt im wesentlichen die zwei rekursionen der ersten option, mit einem einzigen Rekursion:
eigentlich brauchen Sie nicht zu haben
public static int i = 0;
. fürutill
Methode derpos
ist :pos = verkettete Liste der Länge - pos aus dem letzten + 1
Hier
node.next
ist dienext
Knoten. Ich bin direkt auf dienext
Knoten zu fordern, anstatt dienext()
Methode. Hoffe, es hilft.Diese cheats (leicht), aber es sieht gut aus.
Er druckt:
welche ich nehme an das ist richtig.
Ich verwenden
List
statt einigeLinkedList
Variante, weil ich will nicht alles neu erfinden.}
Das finden der N-te element aus der letzten.
Mein Ansatz ist einfach und geradlinig,können Sie die array-Größe, die je nach Ihrer Anforderung:
Müssen Sie geringfügige änderungen im code: