我有下面的代码来使用Swift反转一个双链接列表。但是,我对swap
函数是否正在将currentNode
与其相邻的节点交换感到困惑?或者是交换两个相邻的节点?
例子:
链表值表示法:1->2->3
是在第一次跑步时换1和2吗?还是换了1和3?哪些值在第一次运行时交换?
public func reverse() {
var node = head
while let currentNode = node {
node = currentNode.next
swap(¤tNode.next, ¤tNode.previous)
head = currentNode
}
}
最佳答案
可以在循环内添加print语句(带换行符)以帮助调试,也可以使用调试器添加断点。
我们可以一起通过函数来手动调试,同时也可以提高对以下内容的理解:
首次运行:
public func reverse() {
var node = head
while let currentNode = node {
node = currentNode.next
swap(¤tNode.next, ¤tNode.previous)
head = currentNode
}
}
在此函数中:
将
node
指定给head
。它们都指向值1
的节点如果
node
存在(它确实),则将currentNode
赋值为node
,因此currentNode = node
,因此currentNode = 1 and node = 1 and head = 1
(所有相同的节点)(在
while
):你说,node = currentNode.next
。所以现在node
是2
currentNode = 1
静止。currentNode.previous
是nil
,currentNode.next
是2
。交换之后,列表看起来像:
2 -> nil (->) 3
(我把->放在parens中,因为它实际上并没有“指向”3,因为它是nil)。注意,当我在上面说
=
或is时,就像在node = 2
中一样,我的意思是“node
变量指的是值为2的节点对象”所以我们实际上交换了第一个节点的上一个和下一个节点。