- 如何最快的獲取單鏈表的中間節點的位置?
- 給定一個單鏈表,不知道節點總個數,怎樣只遍歷一次就知道中間節點?
最容易想到的一個方法是:首先先遍歷一遍獲得節點個數,然后取一半作計數器再次遍歷。這個方法遍歷了兩次,是最慢的方法。附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)