测试循环的单个链表

时间:2017-04-01 13:02:03

标签: java algorithm

有没有办法检查单链表是否包含线性时间的周期而不复制和修改列表?

我认为我们可以尝试在拓扑上对此列表进行排序。如果不能有somr循环...但它似乎不会起作用。

2 个答案:

答案 0 :(得分:1)

你可以在恒定的空间内完成而不需要改变数组。

该方法称为Floyd's cycle-finding algorithm。它基于以两个指针以不同速度移动的列表。最终,当且仅当列表包含循环时,指针才会满足。此外,算法找到循环开始的点。查看提供的链接以获取更多详细信息。

答案 1 :(得分:0)

正如评论中所建议的那样,您可以使用快速和慢速迭代器解决方案。

主要洞察力

  

算法的关键见解是,对于任何整数i≥μ和k   ≥0,x(i)= x(i +kλ),其中λ是要找到的循环的长度   μ是循环的第一个元素的索引。特别是,我   =kλ≥μ,当且仅当x(i)= x(2i)时。因此,算法只需要检查这种特殊形式的重复值,一次两次   从序列的开始作为另一个,找到一个周期ν   重复是λ的倍数。一旦找到ν,算法   从开始处回溯序列以找到第一个重复值   序列中的xμ,使用λ除ν的事实,因此   x(μ)= x(μ+ v)。最后,一旦知道μ的值,它就是微不足道的   通过搜索找到最短重复周期的长度λ   第一个位置μ+λ,其中x(μ+λ)= x(μ)。

参考链接: Floyd's Tortoise and Hare