In der Regel eine Möglichkeit, über rekursive Code zu vereinfachen Denken ist nur die Garantien zu berücksichtigen, die angeboten werden, wenn ein rekursive Aufruf abgeschlossen ist. Sie müssen dann überprüfen, ob diese Garantien im Basisfall gelten, der die Rekursion stoppt (z. B. leere Liste oder Liste mit einem einzelnen Knoten), und dass sie bei jedem zusätzlichen rekursiven Aufruf beibehalten werden.
Es gibt ein paar Probleme im Code zur Verfügung gestellt:
die Bedingung, die Rekursion beendet nicht richtig die Situationen behandeln hat, als node.next == null
. Das Feld node.prev
sollte in diesem Fall auf null
gesetzt sein.
Der Variablenname newNode
kann zu Verwirrung führen. Es stellt den neuen Kopf der umgekehrten Liste dar (die das Ende der ursprünglichen Liste war). Ich habe es in newHead
umbenannt.
In Bezug auf den obigen Punkt ist die Zuweisung node.prev=newNode;
nicht korrekt - wir wollen nicht die prev
jedes Knotens auf den Kopf der neuen Liste zeigen.
Nach diesen Aspekten enthält, kehrt der folgende Code korrekt die Liste:
public static Node reverseRecurseDoubleLinkedList(Node node) {
if (node == null) {
return node;
}
if (node.next == null) {
node.prev = null;
return node;
}
Node newHead = reverseRecurseDoubleLinkedList(node.next);
node.next.next = node;
node.prev = node.next;
node.next = null;
return newHead;
}
Möglicherweise gleiche Frage wie http://stackoverflow.com/questions/354875/reversing-a-linked-list- in-java-rekursiv? rq = 1 –
@DuyAnhPham: nein ist es nicht. Ich frage nach doppelt verknüpften Liste, lesen Sie die Frage zuerst. –
Es hat keinen Sinn, eine doppelköpfige Linkliste umzukehren ... Sie könnten einfach Head- und Tail-Referenzen austauschen. – Rugal