如果我们有一个有10个节点的链表,第6个节点指向第2个节点。如何确定
有一些有趣的循环检测算法,最著名的是"龟兔赛跑"算法(又名Floyd循环检测)。这是基于这样的想法:如果兔子走的速度是乌龟的两倍,如果有一个循环,它们会再次相遇。
Brent的算法稍微复杂一点,但倾向于对"下一个"做更少的评估。函数(这里:跟随较少的指针)。
有一些方法可以使用更少的求值。据我所知,它们都是基于使用更多的存储空间。最明显的方法是保留一个"迄今为止看到的节点"的哈希表,当你准备向其中添加一个已经存在的节点时,检测一个循环,立即检测到你第二次看到但占用O(n)空间的节点。Gosper的循环检测算法只占用O(log n)空间,而且更有趣(可能有点难以理解)。还有一个可调的(空间vs评估)算法基于使用多个堆栈(文章包含链接到更多的算法)。
这种情况不可能发生,因为如果你有10个节点,那么链表中的最后一个节点应该是空的。正如你上面所说,在这种情况下,你的第5个节点应该是空的,你将只有5个元素。如果你使用的是循环链表,那么你可以检查
'(last->data== (first++)->data)'