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 rufen previous() oder wenn Sie nicht wissen, was das Ende ist, am Anfang beginnen, arbeiten Sie Ihren Weg bis zum Ende, dann wieder raus n 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 test 0 < 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 aber pntr2.next() 🙂

InformationsquelleAutor user3029486 | 2013-11-25
Schreibe einen Kommentar