链表之——环
1.判断是否有环
定义一个快指针和一个慢指针,看他们是否会相遇,相遇表示一定有环,平直的链表不同速度的指针一定是不会相遇的,而再环中速度不同的指针则一定相遇。
fast=slow=head;
while(fast&&fast->next)//这里定义快的一次走两下所有需要判断next
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)//表示有环
}
2.找环的入口
需先记录下相遇的位置
假设链表头距离入口x,入口到相遇点的距离为y,相遇点到入口为z。
前面定义的快的走两下,慢点一下。
则有:2(x+y)=x+y+n(y+z)这里只有只有快指针的路程加上n(y+z)因为慢指针在第二圈前一定会被追上。
变形:x=(n-1)(y+z)+z
所以链表头到入口的距离就等于快指针先进去转的圈数减一加上z的距离。
相当于在相遇点和链表头定义一个速度相同的指针,在相遇点的指针在经过转的圈数减一加上z的路程后会和在链表头开始的指针会相遇在链表的入口。
代码:
index1=fast//衔接上面的代码这里的fast为相遇位置,slow也可以
index2=head//链表头
while(index1!=index2)
{
index1=index1->next
index2=index2->next
}
return index1;//1和2都行