如果我们有一个包含10个节点的链表,第6个节点指的是第2个节点。我们怎样才能确定
中存在循环答案 0 :(得分:0)
这种情况不会发生,因为如果您有10个节点,那么最后一个节点在链表中应为空。如上所述,在这种情况下,您的第5个节点应为null,并且您只有5个元素。如果您使用循环链表,则可以检查
'(last->data== (first++)->data)'
答案 1 :(得分:0)
有一些有趣的cycle detection算法,最着名的是"乌龟和野兔"算法(又名Floyd'循环检测)。它基于这样的想法:如果野兔走的速度是乌龟的两倍,如果有一个循环,它们将再次相遇。
布伦特的算法有点复杂,但往往对" next" 函数(这里:跟随较少的指针)。
有一些方法可以使用更少的评估。据我所知,所有这些都是基于使用更多的存储。最明显的方法是只保留一个到目前为止看到的节点的哈希表"并检测一个周期,当你即将添加一个已经存在的节点时,立即检测到您第二次看到但占用O(n)空间的节点。 Gosper's loop detection算法只占用O(log n)空间,并且更有趣(或许有点难以理解)。还有一个基于使用multiple stacks的可调(空间与评估)算法(文章包含更多算法的链接)。