链表与环的三个问题:判断是否有环,求环的长度,求环的起点
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。
说得比较抽象,可以画个图看看。
两个指针,一个快一个慢,快指针每次都每次走两步,慢指针每次走一步,如果两个指针相遇了,则说明有环,遇到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。
说得比较抽象,可以画个图看看。
相关文章推荐
- 判断链表是否带环?若带环求环的长度?若带环求环的入口点?并计算以上每个问题的时间复杂度?
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 链表中是否有环及环的起点 cycle detect 及确定环的长度
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 小算法系列-判断单链表是否存在环,判断两个链表是否相交问题详解(转)
- 判断单链表是否存在环型链表问题
- 判断单链表是否存在环,判断两个链表是否相交问题详解(转载)
- 判断单链表是否存在环,判断两个链表是否相交问题详解(转载)
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解<转载>
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解(转载)
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解
- 判断单链表是否存在环,判断两个链表是否相交问题详解