本文主要是介绍快慢指针判断链表中是否存在环查找环的起始位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
判断链表中是否有环?
使用快慢指针, 慢指针一次走一步, 快指针一次走两步, 当快慢指针相遇时,说明链表存在环
为什么快指针每次走两步而慢指针每次走一步呢?
因为slow指针和fast指针都会进入环内, 就像在环形跑道内不同位置的两个人;slow指针在后面,
fast指针在前面, 但实际上fast指针也在追slow指针, 希望能在环内超slow指针一圈(当超过一圈时会
相遇)。那么fast指针总会追上slow指针的;
那么fast指针会不会跳过slow指针呢(为什么快慢指针的步骤差必须为1呢)?
不会的, 因为fast每次走2步,slow每次走1步,假设两者在环内的距离差为N, 那么每次走动, 距离差N都
会缩小一步, 因为fast与slow指针的步长差是1(1也是fast与slow指针之间距离的最小单位);最终,N会减少到0,
也就是两者会相遇。如果fast指针每次走两步,那么当fast与slow间只剩一步时, fast指针会错过slow指针;
如何查找链表环的起始位置?
假设slow指针和fast指针从A点出发, 最终在C点相遇, 那么可以判断链表中存在环; 此时slow指针移动距离为L1+L2, fast指针移动距离为: L1+L2 + L3+L2;
由于fast指针速度是slow指针的2倍, 那么如果slow指针移动的距离为S, 那fast指针移动的记录就是2S, 所以 2 * (L1+L2) = L1+L2+L3+L2, 因此可以得出: L1 == L3
那么如果将fast指针置于C点, slow指针置于A点, 这次以相同的速度移动, 当两个指针再次相遇时, 就是环的起始位置B点
-
伪代码:
fast = head
slow = head //快慢指针都指向头部
do {快指针向后两步慢指针向后一步
} while 快慢指针不相等时
if 指针都为空时{return null // 没有环
}
while 快慢指针不相等时{快指针向后一步慢指针向后一步
}
return fast
这篇关于快慢指针判断链表中是否存在环查找环的起始位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!