2017-09-16 6 views
0

Ich habe den folgenden Code, um eine doppelt verkettete Liste mit Swift umzukehren. Allerdings bin ich verwirrt darüber, ob die swap Funktion die currentNode mit dem benachbarten Knoten vertauscht? oder tauscht es seine zwei benachbarten Knoten aus?Umkehren einer doppelt verketteten Liste mit Swift

Beispiel: verlinkte Listenwerte Darstellung: 1 -> 2 -> 3

es 1 und 2 auf dem ersten Lauf tauscht? oder tauscht es 1 und 3? Welche Werte werden beim ersten Lauf ausgetauscht?

public func reverse() { 
    var node = head 
    while let currentNode = node { 
     node = currentNode.next 
     swap(&currentNode.next, &currentNode.previous) 
     head = currentNode 
    } 
} 

Antwort

0

Der Swap-Aufruf tauscht Verweise auf das nächste und vorherige Element aus. Denn wenn Sie eine doppelt verkettete Liste umkehren, sollten alle "nächsten" Zeiger "vorher" werden und umgekehrt.

einen Blick auf dieses Bild Nehmen Sie zum Beispiel enter image description here

Und stell dir vor, dass Sie auf die Pfeile, die Markierungen ändern müssen (sollten weiter zurück werden, sollte prev next werden).

+0

aber auf dem ersten Lauf, ist nicht A.prev = null? –

+0

@ Maria9905 Es ist. Und wenn Sie die Werte tauschen, erhalten Sie A.next = null - weil Ihr erstes Element Ihr letztes Element wird. – algrid

1

Sie können eine print-Anweisung innerhalb der Schleife (mit einer neuen Zeile) hinzufügen, um beim Debuggen zu helfen, oder den Debugger verwenden, um einen Haltepunkt hinzuzufügen.

wir durch die Funktion gehen können zusammen auch manuell debuggen Verständnis zu verbessern:

Erster Lauf:

public func reverse() { 
    var node = head 
    while let currentNode = node { 
     node = currentNode.next 
     swap(&currentNode.next, &currentNode.previous) 
     head = currentNode 
    } 
} 

In dieser Funktion:

  1. Sie node zu head zuweisen. Sie zeigen sowohl auf den Knoten mit dem Wert 1
  2. wenn node vorhanden ist (es tut), dann zuweisen currentNode-node, so currentNode = node daher currentNode = 1 and node = 1 and head = 1 (egal Knoten)
  3. (Im while): Sie sagen, node = currentNode.next. Also jetzt node ist 2
  4. currentNode = 1 noch. currentNode.previous ist nil und currentNode.next ist 2.
  5. Nach dem Austausch sieht die Liste wie folgt aus: 2 -> nil (->) 3 (Ich habe die -> in Parens, weil es nicht auf 3 "zeigt", da es Null ist).

Beachten Sie, dass, wenn ich sage = oder ist, oben, wie in node = 2, ich meine "node Variable bezieht sich auf die Node-Objekt mit dem Wert von 2"

So sind wir tatsächlich den vorherigen und den nächsten Knoten des ersten Knotens zu tauschen.

Verwandte Themen