Data structures 如何在引用其他节点的链接列表中查找节点

Data structures 如何在引用其他节点的链接列表中查找节点,data-structures,linked-list,Data Structures,Linked List,如果我们有一个包含10个节点的链表,第6个节点指的是第2个节点。我们如何才能确定循环是否存在于中?这种情况不会发生,因为如果有10个节点,则链接列表中的最后一个节点应为空。如上所述,在这种情况下,第5个节点应该为null,并且只有5个元素。如果您使用的是循环链表,则可以检查 '(last->data== (first++)->data)' 有一些有趣的算法,最著名的是“乌龟和兔子”算法(又名弗洛伊德的周期检测)。这是基于这样一个想法:如果兔子的行走速度是乌龟的两倍,如果有一个循环

如果我们有一个包含10个节点的链表,第6个节点指的是第2个节点。我们如何才能确定循环是否存在于

中?这种情况不会发生,因为如果有10个节点,则链接列表中的最后一个节点应为空。如上所述,在这种情况下,第5个节点应该为null,并且只有5个元素。如果您使用的是循环链表,则可以检查

 '(last->data== (first++)->data)'

有一些有趣的算法,最著名的是“乌龟和兔子”算法(又名弗洛伊德的周期检测)。这是基于这样一个想法:如果兔子的行走速度是乌龟的两倍,如果有一个循环,它们会再次相遇

布伦特的算法稍微复杂一点,但倾向于对“下一步”进行较少的评估 函数(此处:遵循更少的指针)


有一些方法可以使用更少的评估。据我所知,所有这些都是基于使用更多的存储空间。最明显的方法是只保留一个“到目前为止看到的节点”的哈希表,当您要向其中添加一个已经存在的节点时,检测一个循环,立即检测第二次看到的节点,但占用O(n)空间。该算法只占用O(logn)空间,而且更有趣(可能有点难以理解)。还有一种基于using(文章包含更多算法的链接)的可调(空间与评估)算法。

如果它在第6个节点之后循环,你怎么能有10个节点?如果你决定链表只能有6个节点,这是重复的阅读:我想链表的糟糕实现。