找到單鏈表中間節點


  • 如何最快的獲取單鏈表中間節點的位置?
  • 給定一個單鏈表,不知道節點總個數,怎樣只遍歷一次就知道中間節點?

  最容易想到的一個方法是:首先先遍歷一遍獲得節點個數,然后取一半作計數器再次遍歷。這個方法遍歷了兩次,是最慢的方法。附Python代碼

class Node:
    def __init__(self, data, next):
        self.data = data
        self.next = next


n1 = Node("n1", None)
n2 = Node("n2", n1)
n3 = Node("n3", n2)
n4 = Node("n4", n3)
n5 = Node("n5", n4)

head = n5  # 鏈表的頭節點

index = 0  # 總節點數
while head.next is not None:
    index += 1
    head = head.next

head = n5
for i in range(0, int(index / 2)):
    head = head.next

print(head.data)

 

  使用兩個指針的方法,這個方法是面試題的正解。一個指針(P1)每次步進一個節點,另一個指針(P2)每次步進兩個節點。當P2遍歷到鏈表尾時,P1正好遍歷到中間節點。附Python代碼:

class Node:
    def __init__(self, data, next):
        self.data = data
        self.next = next


n1 = Node("n1", None)
n2 = Node("n2", n1)
n3 = Node("n3", n2)
n4 = Node("n4", n3)
n5 = Node("n5", n4)

head = n5  # 鏈表的頭節點

P1 = head  # 一次步進1個node
P2 = head  # 一次步進2個node

while P2.next is not None and P2.next.next is not None:
    P2 = P2.next.next
    P1 = P1.next

print(P1.data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM