如果一个链表包含环,如何找出环的入口结点?单链表只有一个指针域,所以环的话一定是后半部分成环或者是一整个。
关于这种链表问题,一般都是可以用双指针来解决。
首先考虑特殊情况,不是环(双指针),链表为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