【问题标题】:How to find a node inside a linked list referring another node如何在链接列表中找到引用另一个节点的节点
【发布时间】:2014-08-02 15:13:29
【问题描述】:
如果我们有一个有 10 个节点的链表,并且第 6 个节点是指第 2 个节点。我们如何才能确定内部存在循环
【问题讨论】:
标签:
data-structures
linked-list
【解决方案1】:
有一些有趣的cycle detection算法,最著名的是“龟兔赛跑”算法(又名弗洛伊德循环检测)。它基于这样的想法,如果兔子走得比乌龟快两倍,如果有一个循环,它们就会再次相遇。
布伦特的算法有点复杂,但倾向于对“下一个”进行较少的评估
函数(这里:遵循更少的指针)。
有一些方法可以使用更少的评估。据我所知,所有这些都是基于使用更多的存储空间。最明显的方法是只保留“迄今为止看到的节点”的哈希表,并在您要向其中添加一个已经存在的节点时检测一个循环,立即检测您第二次看到的节点但占用 O(n) 空间。 Gosper's loop detection 算法只占用 O(log n) 空间,而且更有趣(可能有点难以理解)。还有一个基于使用multiple stacks 的可调(空间与评估)算法(文章包含更多算法的链接)。
【解决方案2】:
这种情况不会发生,因为如果您有 10 个节点,那么链表中的最后一个节点应该为空。正如您在上面所说的那样,在这种情况下您的第 5 个节点应该为空,并且您将只有 5 个元素。如果您使用的是循环链表,那么您可以检查
'(last->data== (first++)->data)'