鏈表中環的入口點( python實現 )
一、題目描述
題目:鏈表中環的入口點
如果一個鏈表中包含環,如何找出環的入口節點。
二、解題思路
暫略。(此處主要作爲書中python實現補充)
三、代碼實現
MeetingNode() 函數主要是用於判斷鏈表中環的存在情況。若存在環,則返回快慢指針相遇的節點,若不存在,則返回 None。
def MeetingNode(pHead):
if pHead is None:
return
pSlow = pHead
pFast = pHead.next
while pSlow is not None and pFast is not None:
if pFast == pSlow:
return pSlow
pSlow = pSlow.next
pFast = pFast.next
if pFast is not None:
pFast = pFast.next
return
在找到環中任意一個節點後,就能得出環中節點數目,並找到入口節點。相應代碼如下:
def EntryNodeOfLoop(pHead):
meetingNode = MeetingNode(pHead)
if meetingNode is None:
return
numOfNodesInLoop = 1
pNode = meetingNode
while pNode.next != meetingNode:
pNode = pNode.next
numOfNodesInLoop = numOfNodesInLoop+1
pNode1 = pHead
for i in range(numOfNodesInLoop):
pNode1 = pNode1.next
pNode2 = pHead
while pNode1 != pNode2:
pNode1 = pNode1.next
pNode2 = pNode2.next
return pNode1
以下用一種簡單粗暴的方式,快速定義一個測試樣例,供大家參考。
定義一個鏈表的數據結構
class LinkedListNode():
def __init__ (self, value = None, next = None):
self.value = value
self.next = next
# 單鏈表類
class SingleLinkedList():
# 初始化
def __init__ (self):
self.head = None
# 判斷鏈表是否爲空
def is_empty(self):
if self.head is None:
return True
# 創建一個新鏈表節點
def add(self,new_value):
node = LinkedListNode(new_value,self.head)
self.head = node
# 增加一個新的結點
def append(self,new_value):
node = LinkedListNode(new_value)
if self.is_empty():
self.head = node
else:
node.next = self.head
self.head = node
自定義一個鏈表類,首先生成一個鏈表: 0->1->2->3->4->5->6->7->8->9,然後將鏈表最後一個節點的 next 指向第5個節點,即這裏值爲4的節點。(以下代碼即爲這裏提到的簡單粗暴的核心)
>>> SLL = SingleLinkedList()
>>> for i in range(9,-1,-1):
SLL.append(i)
>>> pHead = SLL.head
>>> pNode = pHead
>>> for i in range(4): # 這裏若是改爲6,那麼文末的輸出也爲6,可自行測試
pNode = pNode.next
>>> pNodeEnd = pHead
>>> for i in range(9):
pNodeEnd = pNodeEnd.next
>>> pNodeEnd.next = pNode
然後利用自定義的樣例 測試上面的函數 EntryNodeOfLoop() 函數如下:
>>> EntryNodeOfLoop(pHead).value
Out:
4