2017-09-16 63 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的值”

所以我们实际上交换了第一个节点的上一个和下一个节点。