单链表环的位置判定及循环次数

来源:互联网 发布:淘宝怎么不让别人看 编辑:程序博客网 时间:2024/05/16 08:11

  代码是极易找到的。这里所分析的也是异步指针。

  

环的入口点的相关证明

 

   

设慢指针为p1、快指针为p2,初始时分别指向第一个元素(以下用坐标表示,则此时为p1=p2=1)。如上图,m, n分别代表无环部分、环中元素的个数且已知。

首先可以判断第一次相遇时(即判断相遇代码部分),慢指针p1未遍历链表所有元素进入循环(p1<=m+n)。因为当 p1=m+1时(即环的入口点),p2距p1  t<=n-1(注意图中距离为p2->p1粗线条部分,而非p2-p1) ,两者的步速相差1,故只需p2还需走t 步追上p1,p1到末端还有(n-1)个元素,故可以证明第一次相遇时p1<=m+n。

第一次相遇前,慢指针p1走到入口点,即走了m 步,p2走了 2m 步,m 用在环中,设循环了Q次,(nQ<m<(Q+1)n),此时p2距离是环的第 m-nQ 个元素,p2距p1

n-(m-nQ)个元素,故相遇时p2走了 2m+n-(m-nQ)步,p1走了m+n-(m-nQ)步。设相遇时p2共循环了N次,则 Nn+m<2m+n-(m-nQ)<(N+1)n+m;

   让后两指针同步为逐原素遍历,其一指向第一个元素,不妨设为快指针。当这个快指针元素第一次指向环入口时,即经过 m步,此时 慢指针也走了m 步,慢指针共走了m+n-(m-nQ)+m=m+n+nQ步,即为入口点。也就是说,慢指针共走了Q次环,快指针第一次相遇时也走了Q次环,其中 Q<m/n< Q+1。

 

0 0
原创粉丝点击