链表循环检测算法

Posted

技术标签:

【中文标题】链表循环检测算法【英文标题】:Linked list loop detection algorithm 【发布时间】:2011-11-15 22:56:33 【问题描述】:

我在网上阅读了一些面试问题,关于如何找到链表中的循环,解决方案 (Floyd's cycle-finding algorithm) 是有两个指针,一个比另一个快 2 倍,然后检查它们是否再次相遇.

我的问题是:为什么我不能只固定一个指针,每次只将另一个指针向前移动 1 步?

【问题讨论】:

算法的修改速度有点快,如果有人好奇的话:siafoo.net/algorithm/11 【参考方案1】:

因为循环可能不包含第一个指针指向的元素。

例如,如果第一个指针指向元素 1,而链表在 (1->2->3->4->2) 之后有一个循环,则您的算法将无法检测到它。

【讨论】:

刚刚删除了一些小错别字,所以我可以在一周内给你 50+ 良心(因为你只是错过了几秒钟的时间)。 @DaveBall 哇。谢谢。我很高兴你注意到了。 ;)【参考方案2】:

因为可能不是完整的linkedList 在循环中。

对于链表套索检测算法,需要两个指针:

只要第一个指针指向牛仔所在的位置,就不会检测到循环。但如果你一步步向前移动,它最终会进入循环。


顺便说一句,套索是图论的终点技术,牛仔不是。

【讨论】:

【参考方案3】:

因为第一个(不动的)指针可能不在循环内,所以指针永远不会相遇。 (请记住,循环可能只包含列表的一部分。)

【讨论】:

这样就搞定了。谢谢大家,因为我只能标记一个正确的答案,所以我会标记最早的一个。

以上是关于链表循环检测算法的主要内容,如果未能解决你的问题,请参考以下文章

如何检测链表中的循环?

算法2---链表4---单循环链表

使用 Hare and Tortoise 方法在链表中检测循环

c_cpp 检测链表中循环或循环的起始节点

c_cpp 检测链表中的循环

编程算法 - 有序双循环链表的插入 代码(C)