2017-09-16 6 views
0

Swiftを使用して二重リンクリストを逆順にするコードがあります。しかし、swap機能が隣のノードでcurrentNodeをスワップしているかどうか混乱していますか?それとも2つの隣接ノードを交換していますか?Swiftで二重リンクリストを逆転する

例: リンクリストは、値表現: 1 - > 2 - >

3は、それが最初の実行で1と2を交換していますか?それとも1と3を交換していますか?どの値が最初の実行でスワップされますか?

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

答えて

0

スワップコールは、次の要素と前の要素への参照を入れ替えます。なぜなら、二重にリンクされたリストを元に戻すとき、すべての「次の」ポインタは「前の」ポインタになり、その逆も同じになります。

は(次へ前へ、次なるべき、前になる必要があります)例えば enter image description here

を、この画像を見て、あなたは矢印のマークを変更する必要があることを想像してください。

+0

最初の実行では、A.prev = nullではありませんか? –

+0

@ Maria9905です。値を入れ替えるとA.next = nullになります。なぜなら最初の要素が最後の要素になるからです。 – algrid

1

デバッグに役立つループ内にprint文を追加することができます(改行を使用)。デバッガを使用してブレークポイントを追加することもできます。

我々は、手動での理解を向上させるためにもデバッグするために一緒に機能を通過することができます

最初の実行:この機能で

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

  1. あなたはheadnodeを割り当てます。彼らは両方の(すべて同じノード)
  2. whileで)のでcurrentNode = 1 and node = 1 and head = 1、そうcurrentNode = nodenodeは(それがない)が存在する場合には、nodecurrentNodeを割り当てる値1
  3. でノードを指している:あなたは、例えば、node = currentNode.next。だから今度はnode2
  4. currentNode = 1です。 currentNode.previousnilであり、currentNode.next2である。
  5. スワップの後、リストは2 -> nil (->) 3のようになります(実際には「ポイントしていません」という理由で、括弧内に - >を入れます)。私は=node = 2のように、上記、であると言うとき、私は私達がしている

    node変数が2の値でNodeオブジェクトを参照している」ことを意味することを

注意実際には最初のノードの前後を入れ替えます。

関連する問題