2017-09-16 62 views
0

我有下面的代碼來使用Swift顛倒雙鏈表。不過,我很困惑swap函數是否將currentNode與相鄰的節點交換?還是交換它的兩個相鄰節點?使用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

這裏的swap調用將引用交換到下一個元素和上一個元素。因爲當你恢復一個雙向鏈表時,所有「下一個」指針應該變成「前一個」,反之亦然。

這個圖片看看例如 enter image description here

想象着你需要改變的箭頭標記(未來應該成爲分組,分組應該成爲下一個)。

+0

但在第一次運行時,不是A.prev = null? –

+0

@ Maria9905它是。當你交換值時,你會得到A.next = null - 因爲你的第一個元素成爲你的最後一個元素。 – algrid

1

您可以在循環內添加打印語句(使用換行符)以幫助您進行調試,或使用調試器添加斷點。

我們可以順利通過功能配合手動調試,以及增進了解:

首先運行:

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

在這個函數:

  1. 分配nodehead。他們都指向節點與1
  2. 如果node存在(它),然後分配給currentNodenode,所以currentNode = node,價值因此currentNode = 1 and node = 1 and head = 1(全部在同一節點)
  3. (在while):你說,node = currentNode.next。所以現在node2
  4. currentNode = 1仍然。 currentNode.previousnilcurrentNode.next2
  5. 交換後,列表看起來像︰2 -> nil (->) 3(我把 - >在parens因爲它實際上沒有「指向」3,因爲它是零)。

需要注意的是,當我說=,上面像node = 2,我的意思是「node變量是指Node對象爲2的值」

所以我們實際上交換了第一個節點的上一個和下一個節點。