思路:
设计两个指针,1个slow指针每次走一步,1个fast指针每次走两步,如果链表没环,那么fast最后指向为空.
如果链表有环,那么fast指针和low指针会在圆环的某个点相遇
bool iscycle(linkNode *head){
linkNode *fast = head ,*slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast == now)
break;
}
return !(!fast || !fast->next);
}
找环的入口点
假设slow走了s步,fast走了2*s步,那么s + n*r = 2*s;
即s = n * r;
假设链表表头到环入口距离m,相遇点距离环入口p,
那么m+r-p = n*r;
所以m-p = (n-1)*r (n >= 1)
因此设置两个指针st在链表头,sp在相遇点,那么两个指针一定会相遇,且它们的距离差是环的整数倍,且相遇点一定在环入口。
bool findcyclestart(linkNode *head){
linkNode *fast = head ,*slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(fast == now)
break;
}
fast = head;
while(fast && slow){
if(fast == slow)
break;
fast = fast->next;
slow = slow->next;
}
}
点评:本题主要考察数学推导运算....在求环入口点时,找到两个点,一个是链表头,一个是相遇点,然后两者和入口点的距离只差是环的倍数,从而找到环入口是解题的关键.