劍指offer_面試題23 : 鏈表中環的入口點( python實現 )

鏈表中環的入口點( 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章