您的位置:首页 > 其它

链表与环的三个问题:判断是否有环,求环的长度,求环的起点

2017-01-11 18:28 239 查看
1. 判断单链表是否有环

两个指针,一个快一个慢,快指针每次都每次走两步,慢指针每次走一步,如果两个指针相遇了,则说明有环,遇到NULL,则说明无环。

2. 求单链表中环的长度

还是原来的快慢指针,假设他们在p点相遇,相遇之后继续走,下一次相遇的的时候,快指针比慢指针多走的距离正好是环的长度。

3. 求单链表中环的起点

这个稍微复杂一下,我们假设链表的起点位点h,环的起点为点a,环的长度为l,上面的快慢指针在p点相遇。

继续假设相遇的时候,快指针绕着环走了m圈,慢指针绕着环走了n圈,那么:

慢指针走的长度:(h-->a) + (a-->p) + n*l

快指针走的长度:(h-->a) + (a-->p) + m*l

则 2 * ( (h-->a) + (a-->p) + n*l ) = (h-->a) + (a-->p) + m*l

化简一下得到:(h-->a) + (a-->p) + 2*n*l = m*l

(h-->a) + (a-->p) = (m-2*n)*l

(h-->a)
= (m-2*n)*l - (a-->p)

说明假如点x从链表的起点开始,点y从p点开始走,每次都走一部,当x走到环的起点a时,y正好也到环的起点a,因为正好是环的倍数差了(a-->p)嘛,而y正好是从p点出发的所以正好是会到环的起点a。

说得比较抽象,可以画个图看看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐