如何确定链表中是否包含循环?

6

我自己在面试中错过了这个确切的问题。我只能提供O(n)的内存和时间解决方案。 - Thanatos
1
我在计算机科学课上学过这个,但我认为这不是一个特别好的问题,因为它“只有在你已经知道的情况下才显而易见”。 - Brendan Long
许多重复的问题,例如在不使用两个指针的情况下查找链表中的循环 - Paul R
Danny 发布了一个很好的回答--如果你想学习更多关于它的搜索术语,可以尝试搜索“Floyd 循环检测算法”或“龟兔算法”。 - Jim Lewis
3个回答

11

简单。将两个指针定位在链表中。每一步,一个指针向前移动一个链接,另一个指针向前移动两个链接。测试它们是否指向同一个元素。如果是,则存在一个循环。如果不是,则重复此过程直到找到循环或达到链表的末尾。


11
我发现这个解决方案只有在你知道它的情况下才是“易于”的。这是我认为非常聪明的想法。 - Thanatos
有趣。为什么要费心推进另一个呢? - T.E.D.
任何链接都可能等同于其他链接,因此它们必须在列表中移动以测试每个(可达)组合。 - Ether
1
@T.E.D:链表的第一个节点可能不是环的一部分。当且仅当存在循环时,会有某个 i 满足 X_i = X_2*i,并且乌龟和兔子算法找到最小的这样的 i(如果存在)。 - Jim Lewis
啊哈。谢谢。这个名字听起来很熟悉,但我的计算机科学算法课已经超过20年了。 - T.E.D.

1

可能与检查图是否为树的技术相同(树不允许有循环),请参见this this question。建议使用拓扑排序或深度优先搜索。


-1

上周在实际的代码中我遇到了这个完全相同的问题。

我所做的只是保留一个指针(链接)指向第一个元素。然后当我遍历列表时,如果我再次遇到那个指针,我就知道有一个循环。


1
请查看最佳答案的评论,了解为什么这个方法无法捕捉到所有的循环,并且为什么有更好的解决方案。 - T.E.D.
循环不一定从第一个元素开始。 - Nicolas Barbulesco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接