快慢指针判断有环
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步再相遇一次。并且在同一个地方相遇。
快慢指针检测链表环
本文介绍了一种使用快慢指针检测链表中是否存在环的有效算法。通过对比快慢指针的移动速度,当两者在环内相遇时,即可判断链表存在环。并详细解释了快慢指针相遇的数学原理,证明了每经过有环节点数y步,快慢指针会在同一位置相遇。
459

被折叠的 条评论
为什么被折叠?



