有环单链表,找环的入口。

Posted 苏轶然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有环单链表,找环的入口。相关的知识,希望对你有一定的参考价值。

先说结论:常用二指针找环的方法,两倍速,则相遇点到环入口的距离和链表头结点到链表环入口的距离相等。

 

 

如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。

为什么呢?需要一个简单的计算过程:
(1)当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈。假设slow走了s步,那么fast走了2s步。fast的步数还等于s走的加上环里转的n圈,所以有:
2s = s + nr。因此,s = nr。
(2)设整个链表长为L,入口据相遇点X,起点到入口的距离为a。因为slow指针并没有走完一圈,所以:
a + x = s,带入第一步的结果,有:a + x = nr = (n-1)r + r = (n-1)r + L - a;即:
a = (n-1)r + L -a -x;
这说明:从头结点到入口的距离,等于转了(n-1)圈以后,相遇点到入口的距离。因此,我们可以在链表头、相遇点各设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

 

 1 综上:你需要知道这几个关系:
 2 
 3 s = 2s
 4 
 5 s = a + x
 6 
 7 2s = s + nr
 8 
 9 r = L - a
10 
11 要解这个:L - a - x 

 

以上是关于有环单链表,找环的入口。的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之深入解析如何确定单链表有环并求环的入口和长度

线性表练习之Example048-判断一个单链表是否有环,如果有则找出环的入口点并返回,否则返回 NULL

leetcode链表--6linked-list-cycle-ii(有环单链表环的入口结点)

(转)求单链表是否有环,环入口和环长

数据结构与算法判断一个单链表是否有环及环入口

链表是否有环