反向链接列表

我目前正在解决iOS开发人员遇到的常见数据结构/算法问题,并且反向链接列表就是其中之一。 我们需要做的第一件事是建立链接列表的基础。

因此,我们要做的是编译将成为列表的节点列表,oneNode,twoNode和ThreeNode。 让我们编写一个函数以打印出链接列表,以仔细检查所有文件的顺序是否正确。

查看打印输出。

为了真正理解我们应该如何反向链接列表,让我们使用一些箭头来指示每个节点如何相互引用以及其最终外观如何。

目前,我们的链接列表如下所示:

1→2→3→无

我们想要的是……。

3→2→1→无

反转列表的方式应如下所示:

无←1→2→3→无

无←1←2→3→无

无←1←2←3

我们要完成的工作与反转数组有很大不同,在这种情况下,您可以简单地从最后一个元素开始迭代,然后从第一个元素结束。 这是实际上反转指针并确保正确调整头和尾以及其所有下一个值的问题。

让我们看一下这里发生的事情。 我们将currentNode设置为等于头,即链表中的第一个节点。 currentNode还是在while循环中用于定义条件语句的变量。 接下来,我们还有两个变量,previousNode和nextNode,它们也将进行更改。 只要currentNode不等于nil,我们就想遍历列表,如果它变为nil,我们想跳出循环。 1→2→3→n的可视化在这里很有用。

因此,我们要做的第一件事就是将nextNode设置为等于currentNode的下一个节点。 因此,我们从列表开始,以1为头节点,然后将nextNode设置为2,因此nextNode = currentNode?.next。 然后,我切换了齿轮以在return语句之前编写最后一行代码,即currentNode = nextNode,因为对我而言,从逻辑上讲,当我们完成对所有其他变量的引用的更改后,我们需要一个新的头节点迭代并重新计算所有其他值。

现在是棘手的部分……我们该如何处理previousNode和currentNode的next属性? 在我们的循环中,到目前为止,previousNode的值是以下nil,1、2。如果要递增,我们希望这些值变为1、2、3或previousNode等于CurrentNode。 但是,我们仍然需要容纳currentNode?.next,它在更改它之前指向了previousNode。 本质上,我们在翻转currentNode?.next和previousNode的值,如果我们注释掉这一行,则您会注意到节点列表未打印,它的位置是3。currentNode?.next = previousNode有助于跟踪之前的哪个节点在thirdNode之前。

然后,当我们考虑外循环的下一个迭代时,我们将previousNode设置为currentNode,因为它是列表中的下一个节点。 最后,将currentNode更改为nextNode,以继续到下一个节点值。 您返回上一个节点是因为我们要返回链接列表中的新“头”或初始节点。