单链表中环的检测

来源:互联网 发布:macair windows 编辑:程序博客网 时间:2024/06/05 08:10

单链表中环的检测

首先设置两个指针,分别命名为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,即入口结点。

0 0
原创粉丝点击