Ich habe versucht zu vermeiden, diese Frage hier zu stellen, aber nach fast einer Stunde mit Blick auf das gleiche Stück Code habe ich wirklich keine Ahnung, warum der folgende Code eine doppelt verknüpfte nicht umkehren kann Liste:Warum schlägt dieser Code eine doppelt verkettete Liste nicht um
Node* Reverse(Node* head) {
if (head == nullptr) {return head;}
Node *iter = head, *tail, *newTail;
while (iter -> next != nullptr) {iter = iter -> next;} //to set the tail pointer
tail = iter;
newTail = tail; //the node that will become the tail after reversing is done
iter = head;
while (iter != tail) {
newTail -> next = iter;
iter -> prev = newTail;
newTail = iter;
iter = iter -> next;
}
newTail -> next = nullptr;
tail -> prev = nullptr;
return tail;
}
Ich würde jede Hilfe zu schätzen wissen.
BEARBEITEN Es scheint, dass der Code nichts mit dem zu tun hat, was ich vorhatte. Beeindruckend. Als Randnotiz habe ich nur den einführenden Programmierkurs absolviert, der keine Hinweise, geschweige denn verknüpfte Listen etc. enthält. Danke für Ihre Hilfe!
ENDGÜLTIGER CODE Wenn Sie interessiert sind, habe ich meinen Algorithmus zum Umkehren einer doppelt verketteten Liste beendet. Ich denke, es ist ein netter Ansatz, obwohl ich natürlich offen für Vorschläge bin.
Ich würde etwas anders arbeiten. Erreiche zuerst den Schwanz und baue dann eine neue Liste auf. Und immer das nächste Element vorholen. Ich werde auch sagen, dass das Ändern der Semantik von newTail während des Code-Betriebs Code-Geruch ist und zu Verwirrung führen kann. Und zu Fehlern. –