第一步:先找到环中的一个点
第二步:确定环中有几个元素,比如n个
第三步:让第一个指针先走n步,第二个指针再从头走,两指针相遇即为入口结点
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
meetingNode = self.MeetingNode(pHead)
if meetingNode == None:
return None
#确定环中有几个元素
step = 1
pNode1 = meetingNode
while (pNode1.next != meetingNode):
pNode1 = pNode1.next
step += 1
#让前面一个指针先走step步
pNodeFound = pHead
for i in range(step):
pNodeFound = pNodeFound.next
pNodeLast = pHead
#前后指针相遇即为入口结点
while (pNodeFound != pNodeLast):
pNodeFound = pNodeFound.next
pNodeLast = pNodeLast.next
return pNodeFound
#确定是否有环,有环的话找到环中的一点
def MeetingNode(self, pHead):
pNode = pHead
if pNode == None:
return None
pSlow = pNode.next
if pSlow == None:
return None
pFast = pSlow.next
while (pFast != None and pSlow != None):
if pFast == pSlow:
return pSlow
pSlow = pSlow.next
pFast = pFast.next
if pFast != pSlow:
pFast = pFast.next