链表循环检测算法

时间:2011-09-13 08:12:37

标签: algorithm linked-list floyd-cycle-finding

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

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

3 个答案:

答案 0 :(得分:82)

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

对于链接列表 lasso 检测算法,您需要两个指针:

enter image description here

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


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

答案 1 :(得分:55)

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

答案 2 :(得分:26)

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

例如,如果第一个指针指向元素1并且链接列表稍后有一个循环(1-> 2-> 3-> 4-> 2>),则您的算法将不会检测到它