Floyed判圈算法

给你一个链表,要你判断这个链表中是否有环并求出环的长度(如果有环)。遇上这样的问题,暴力是过不了的,这时我们就可以用上Floyed判圈算法


Floyed算法,又称龟兔赛跑算法,是著名的判圈算法,中心思想是假设有两个小孩同时从一个跑道的起点出发向前跑,其中一个的速度是另一个的两倍,那么,如果路是一条直线,则跑得快的小孩应先到达终点,如果路上存在环,则跑得快的小孩最终会与跑得慢的小孩相遇。


所以,我们只要设定两个指针i,j(即两个小孩),最开始全都指向链表头,并且i移动的速度是j的两倍。当i指向空指针时(即跑得快的小孩到达终点时),就代表该链表无环。当i与j相遇时(跑得快的小孩与跑得慢的小孩相遇,则代表有环。

假设链表头距离环的距离是x(即x是环的起点),环的长度为n,i和j相遇的位置距环的起点k个单位。

当i和j第一次相遇时,假设j走了u个单位,则u=x+a*n+k(a为正整数)

又因为i的速度是j的两倍,所以i走了2u个单位,则2u=x+b*n+k(b为正整数且b>a)

相减得到u=(b-a)*n

因此u为环长的倍数。


为了求出准确的环长,可以在i与j第一次相遇后,让i与j继续移动,并记录i与j移动的单位长度。等它们两个再次相遇时,i比j多移动的单位数就是环的长度了。

以上便是Floyed判圈算法的全部内容,是不是很简单而又实用呢?



注:如果您通过此文学会了Floyed判圈算法,请您点个赞再离开。当然,也欢迎在讨论区指出此文的不足处,作者会及时对此文加以修正
版权声明:转载请注明地址

猜你喜欢

转载自blog.csdn.net/chenxiaoran666/article/details/80028784