快慢指针判断有环
int LinkList p =L;//快
int LinkList q =L;//慢
while(p->next!=NULL&&q!=NULL&&q!=NULL)
{
p = p->next->next;
q = q->next;
if(p==q)
return 1;//有环
return 0;
}
证明快慢指针会相遇
假设无环的部分有x个节点bai,有环部分有y个节点。慢指针du走t步与zhi快指针相遇。
那么慢指针在环中走的长度为t-x,快指针为2t-x(假设快指针每次走2)。
再假设慢指针在环中走过k1圈,快指针为k2圈。并在环中第n个地方相遇。
则慢指针在环中走的长度为k1y+n,快指针为k2y+n;
可得t-x=k1y+n
2t-x=k2y+n
两式相减得t=(k2-k1)*y。所以可知慢指针走过y步后可第一次与快指针相遇,再过y步再相遇一次。并且在同一个地方相遇。