text: c — Verwenden von Zeigern, um ein Element aus der einzeln verknüpften Liste zu entfernen
  /Verwenden von Zeigern, um ein Element aus der einzeln verknüpften Liste zu entfernen
  In einem aktuellen Slashdot-Interview gab Linus Torvalds ein Beispiel, wie manche Leute Zeiger verwenden, die darauf schließen lassen, dass sie nicht wirklich verstehen, wie man sie richtig verwendet.
  Da ich einer der Leute bin, über die er spricht, habe ich sein Beispiel leider nicht verstanden:
  Ich habe zu viele Leute gesehen, die einen einfach verknüpften Listeneintrag löschen, indem Sie den Eintrag "prev" verfolgen und dann den Eintrag löschen, indem Sie so etwas wie
  und immer wenn ich so Code sehe, gehe ich einfach "Diese Person versteht nicht Zeiger verstehen". Und das ist leider ziemlich üblich. Leute die Für Zeiger verwenden Sie einfach einen "Zeiger auf den Eingabezeiger" und initialisieren Sie das mit der Adresse des list_head. Und dann wie sie Wenn Sie die Liste durchlaufen, können Sie den Eintrag entfernen, ohne ein beliebiges .__ zu verwenden. Bedingungen, indem Sie einfach
  Kann jemand etwas mehr erklären, warum dieser Ansatz besser ist und wie er ohne bedingte Anweisung funktionieren kann?
  16.10.2012 codebox
  Am Anfang machst du das
  und, während Sie die Liste durchlaufen, bewegen Sie diesen "Cursor" mit
  Auf diese Weise behalten Sie immer den Punkt im Auge, von dem "Sie kommen" und können den dort lebenden Zeiger ändern.
  Wenn Sie also herausfinden, dass der Eintrag gelöscht werden soll, können Sie dies einfach tun
  Auf diese Weise erledigen Sie alle 3 Fälle Afaq in einer anderen Antwort und eliminieren so effektiv die NULL-Prüfung auf prev.
  16.10.2012 glglgl
  Es ist interessanter, die Liste erneut zu verbinden, sobald ein Knoten entfernt werden soll. Betrachten wir mindestens 3 Fälle:
  1.Entfernen eines Knotens von Anfang an.
  2.Entfernen eines Knotens aus der Mitte.
  3.Entfernen eines Knotens vom Ende.
  Entfernen von Anfang an
  Beim Entfernen des Knotens am Anfang der Liste müssen keine Knoten neu verknüpft werden, da der erste Knoten keinen vorhergehenden Knoten hat. Beispiel: Entfernen des Knotens mit einem:
  Wir müssen jedoch den Zeiger an den Anfang der Liste setzen:
  Entfernen aus der Mitte
  Um einen Knoten aus der Mitte zu entfernen, muss der vorherige Knoten den zu entfernenden Knoten überspringen. Zum Beispiel den Knoten mit b entfernen:
  Dies bedeutet, dass wir einen Weg benötigen, um auf den Knoten vor dem Knoten zu verweisen, den wir entfernen möchten.
  Entfernen vom Ende
  Das Entfernen eines Knotens vom Ende erfordert, dass der vorherige Knoten das neue Ende der Liste wird (d. H. Auf nichts danach zeigt). So entfernen Sie beispielsweise den Knoten mit c:
  Beachten Sie, dass die letzten beiden Fälle (Mitte und Ende) kombiniert werden können, indem Sie sagen, dass "der Knoten, der dem zu entfernenden Knoten vorangeht, zeigen muss, wohin der zu entfernende Fall geht."
  16.10.2012 Afaq
  Dieses Problem wurde von Philip Buuck in diesem YouTube-Video diskutiert. Ich empfehle Ihnen, dies zu beachten, wenn Sie eine ausführlichere Erklärung benötigen.
  Erklärung von Beispiel
  Wenn Sie gerne von Beispielen lernen, habe ich eines vorbereitet. Nehmen wir an, wir haben die folgende einfach verknüpfte Liste:
  das wird wie folgt dargestellt (klicken zum vergrößern):
  Wir möchten den Knoten mit dem value = 8 löschen.
  Hier ist der einfache Code, der dies tut:
  Wenn Sie diesen Code kompilieren und ausführen, erhalten Sie Folgendes:
  Erstellen wir **p 'double' auf *head:
  Lassen Sie uns nun analysieren, wie void remove_from_list(int val, node_t **head) funktioniert. Es durchläuft die Liste, auf die head zeigt, solange *p && (**p).value != val.
  In diesem Beispiel enthält die Liste value, die gelöscht werden soll (8). Nach der zweiten Iteration der while (*p && (**p).value != val)-Schleife (**p).value wird 8, und wir hören auf zu iterieren.
  Beachten Sie, dass *p auf die Variable node_t *next in node_t zeigt, die vor dem node_t ist, den Sie löschen möchten (was **p ist). Dies ist wichtig, da wir damit den *next-Zeiger des node_t vor dem node_t ändern können, den wir löschen möchten, und ihn effektiv aus der Liste entfernen.
  Nun weisen wir die Adresse des Elements, das wir entfernen möchten (del->value == 8), dem *del-Zeiger zu.
  Wir müssen den *p-Zeiger so korrigieren, dass **p auf das Element after*del-Element zeigte, das wir löschen möchten:
  Im obigen Code rufen wir free(del) auf. Daher ist es nicht notwendig, del->next auf NULL zu setzen. Wenn wir jedoch den Zeiger auf das Element 'detached' aus der Liste zurückgeben möchten, anstatt ihn vollständig zu entfernen, würden wir del->next = NULL setzen:
  17.02.2018 patryk.beza
  Im ersten Ansatz löschen Sie einen Knoten, indem Sie Verknüpfung aufheben ihn aus der Liste entfernen.
  Im zweiten Ansatz Ersetzen wird der zu löschende Knoten durch den nächsten Knoten ersetzt.
  Offensichtlich vereinfacht der zweite Ansatz den Code auf elegante Weise. Auf jeden Fall erfordert der zweite Ansatz ein besseres Verständnis der verknüpften Liste und des zugrunde liegenden Berechnungsmodells.
  Hinweis: Hier ist eine sehr relevante, aber etwas andere Kodierungsfrage. Gut zum Testen des eigenen Verständnisses: https://leetcode.com/problems/delete-node-in-a-linked-list/
  20.05.2016 ZillGate
  Ich bevorzuge den Dummy-Knoten-Ansatz, ein Beispiellayout:
  und dann fahren Sie zu dem Knoten, den Sie löschen möchten (toDel = curr> next)
  curr->next = curr->next-next;
  Auf diese Weise müssen Sie nicht prüfen, ob es das erste Element ist, da das erste Element immer Dummy ist und niemals gelöscht wird.
  16.10.2012 Xee
  Ich schrieb folgendes einfaches Beispiel. Ich hoffe, Sie können sehen, warum es funktioniert.
  In Funktion void delete_node(LinkedList *list, void *data) verwende ich *pp = (*pp)->next; und es funktioniert. Ehrlich gesagt verstehe ich nicht, warum es funktioniert. Ich zeichne sogar das Zeigerdiagramm, verstehe es aber immer noch nicht. Hoffe du kannst es klären.
  23.08.2017 Lion Lai
  Hier ist ein komplettes Codebeispiel, bei dem mit einem Funktionsaufruf übereinstimmende Elemente entfernt werden: