我有下面的代码来使用Swift反转一个双链接列表。但是,我对swap函数是否正在将currentNode与其相邻的节点交换感到困惑?或者是交换两个相邻的节点?
例子:
链表值表示法: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
    }
}

最佳答案

可以在循环内添加print语句(带换行符)以帮助调试,也可以使用调试器添加断点。
我们可以一起通过函数来手动调试,同时也可以提高对以下内容的理解:
首次运行:

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

在此函数中:
node指定给head。它们都指向值1的节点
如果node存在(它确实),则将currentNode赋值为node,因此currentNode = node,因此currentNode = 1 and node = 1 and head = 1(所有相同的节点)
(在while):你说,node = currentNode.next。所以现在node2
currentNode = 1静止。currentNode.previousnilcurrentNode.next2
交换之后,列表看起来像:2 -> nil (->) 3(我把->放在parens中,因为它实际上并没有“指向”3,因为它是nil)。
注意,当我在上面说=或is时,就像在node = 2中一样,我的意思是“node变量指的是值为2的节点对象”
所以我们实际上交换了第一个节点的上一个和下一个节点。

10-08 06:39