链表环的入口结点

如果一个链表包含环,如何找出环的入口结点?单链表只有一个指针域,所以环的话一定是后半部分成环或者是一整个。
关于这种链表问题,一般都是可以用双指针来解决。
首先考虑特殊情况,不是环(双指针),链表为None。
1.通过pre和latter两个指针,同时走,pre的速度是latter的两倍,如果pre小于等于latter,说明有环。
2.二是判断入口的结点,可以通过先计算出环的结点数目N,然后让pre先走N步,接着两者一起走,当pre=latter,此时就是结点。一个已经走完了环,一个刚到环的结点,相遇。
3.计算结点的数目,如第一步所示,在两者相遇之后,一个不动,另外一个移动,直到再次相遇,每走一步+1,算出结点的数目。
没有验证过正确性。仅提供思路。


class Solution():
    def meet(self, head):
        pre = 0
        latter = 0
        phead1 = head
        phead2 = head
        phead2 = phead2.next
        while phead2 != phead1:
            if phead2.next.next != None:
                phead2 = phead2.next.next
                pre += 2
            if phead1.next != None:
                phead1 = phead1.next
                latter += 1
            if phead2.next.next == None:
                return False
        return phead1
    
    
    def nodenumber(self, head):
        phead2 = self.meet(head)
        phead3 = phead2
        phead3 = phead3.next
        a = 1
        while phead3 != phead2:
            phead3 = phead3.next
            a += 1
        return a
    
    def entrance(self, head):
        if not head:
            return 
        if head.next == None:
            return 
        if self.meet(head):
            a = self.nodenumber(head)
            phead1 = head
            phead2 = head
            for i in range(0, a):
                phead1 = phead1.next
            while phead1 != phead2:
                phead1 = phead1.next
                phead2 = phead2.next
            return phead1
        return  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值