单链表中环的检测
首先设置两个指针,分别命名为fast和slow,fast指针每次向后移2步,slow指针每次向后移1步。
如果,fast指针最后走到尾结点,则没有环。
如果,fast指针和slow指针相遇,则证明有环。
环的起始结点的查询
当fast与slow相遇之后,
fast指针从头结点开始走,每次走1步
当fast再次与slow相遇以后,相遇处的结点为环的入口结点
证明
推导1:fast指针的步长是否可以>2
证明:以第一个链表为例,假设步长为3,当 步长>环的长度 会形成死循环,fast和slow无法相遇,存在环确无法验证码。而,构成环的最少需要两个结点,所以,步长设置为2.
推导2:如何证明fast和slow第二次循环相遇处为环的入口结点
证明:设,环的入口结点到head结点的距离为k,即,第k个结点,fast与slow相遇的结点为k结点之后的a个结点(a>=0),环的长度为x,fast在环中转了 n 圈以后与slow第一次相遇与a。则:
k+a=2×(k+a)-nx;//相遇时的结点
k+a=nx; //转n圈与k+a相等
此刻,fast回到head结点,步长为1,
当fast结点走到k结点时,slow结点走的路程为,k+a+k=k+nx,nx为在环中循环可忽略,即可发现,第二次相遇位置为 k,即入口结点。