循环链表检测算法

时间:2012-06-15 00:15:23

标签: data-structures linked-list circular-list

所以我的问题是在乌龟和兔子/继承人算法中检测圆形链表,为什么有必要将第二个更快的指针增加2? 我无法弄清楚,我在这里找不到任何答案。

将第一个慢速指针递增1是有意义的,这样我们就会迭代所有我们将与第二个指针进行比较的元素但是为什么更快的指针只需要增加2.为什么我们可以将它增加3或者4个或更多????

有没有办法计算什么应该是否定的。跳跃(如果不是2)更快的指针相对于列表中的元素数量???

2 个答案:

答案 0 :(得分:0)

你可以使用3,4或任何你想要的但是最快的方式是2,因为假设你是第一次以2步进入循环:( D是指针是2步,S是普通指针。
案例1)

step 1 :x - D - x - S - x - x ...
step 2 :x - x - x - D - S - x ...
step 3 :x - x - x - x - x - SD ( match)

案例2)

step 1: x - D - S - x this is the step 2 from case 1 and we can see that this is step 2 and we also have a match

但是如果你让我们说3步(D应该是一次指向3步的指针。)

案例1)

   step 1 : x - D - x - x - S ...
   step 2 : x - x - x - x - D - S ...
   step 3 : x - x - x - x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)

案例2)

step 1 : x - D - x - S -..
step 2 : x - x - x - x - SD ( match)

案例3)

step 1: x - D - S - ..
step 2: x - x - x - S - D ... ( D is passing S and it needs at least another loop to meet S)

因为2比你想要的好4或者4,因为所有大于2的数字都有可能第一次见到1 /(N-1)。
另一种解释方法是:对于D和S,如果S和D之间的距离是N-1,则步长为N,我们有一个匹配(D进N步,S进1步比D进= S),其他方式D通过S所以我们有1 /(N-1)次机会第一次遇到S和D,因此如果N = 2我们有1/1 = 100%,如果N = 3我们有1/2 = 50%。 希望有所帮助。

答案 1 :(得分:0)

如果您使用3或4作为步长,则需要在前进3时可能导致在第一个或第二个节点处为空时为所有特殊情况添加检查。

此外,如果出现一个周期,你有可能从慢速中的3个位置中选择任意一个位置。

只需要更多的代码,更多的条件来处理,容易出错,并且在Big O方面使用2个以上没有任何性能提升时显得不那么优雅