用Swift反转双链表

时间:2017-09-16 23:14:29

标签: swift linked-list

我有以下代码使用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
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在循环内添加print语句(使用换行符)以帮助您进行调试,或使用调试器添加断点。

我们可以一起完成这个功能,手动调试以提高理解力:

首先运行:

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

在此功能中:

  1. 您将node分配给head。他们都指向具有值1
  2. 的节点
  3. 如果node存在(确实如此),则将currentNode分配给node,然后分配currentNode = node,因此currentNode = 1 and node = 1 and head = 1(所有相同的节点)
  4. (在while中):你说,node = currentNode.next。现在node2
  5. currentNode = 1仍然。 currentNode.previousnilcurrentNode.next2
  6. 在交换之后,列表看起来像是:2 -> nil (->) 3(我把 - >放在parens中,因为它实际上并没有#34;指向"因为它是#3无)。
  7. 请注意,当我说= 时,就像在node = 2中一样,我的意思是" node变量指的是使用值为2"

    的Node对象

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

答案 1 :(得分:0)

此处的交换调用交换对下一个和上一个元素的引用。因为当你还原一个双向链表时,所有“下一个”指针应该变成“前一个”,反之亦然。

以此图片为例 enter image description here

想象你需要改变箭头上的标记(下一个应该变为上一个,上一个应该成为下一个)。

相关问题