链表循环检测算法
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】:因为第一个(不动的)指针可能不在循环内,所以指针永远不会相遇。 (请记住,循环可能只包含列表的一部分。)
【讨论】:
这样就搞定了。谢谢大家,因为我只能标记一个正确的答案,所以我会标记最早的一个。以上是关于链表循环检测算法的主要内容,如果未能解决你的问题,请参考以下文章