快慢指針也是一個可以用于很多問題的技巧。所謂快慢指針中的快慢指的是指針向前移動的步長,每次移動的步長較大即為快,步長較小即為慢,常用的快慢指針一般是在單連結清單中讓快指針每次向前移動2,慢指針則每次向前移動1。快慢兩個指針都從連結清單頭開始周遊,于是快指針到達連結清單末尾的時候慢指針剛好到達中間位置,于是可以得到中間元素的值。快慢指針在連結清單相關問題中主要有兩個應用:
- 快速找出未知長度單連結清單的中間節點 設定兩個指針 *fast、*slow 都指向單連結清單的頭節點,其中*fast的移動速度是*slow的2倍,當*fast指向末尾節點的時候,slow正好就在中間了。
- 判斷單連結清單是否有環 利用快慢指針的原理,同樣設定兩個指針 *fast、*slow 都指向單連結清單的頭節點,其中 *fast的移動速度是*slow的2倍。如果 *fast = NULL,說明該單連結清單 以 NULL結尾,不是循環連結清單;如果 *fast = *slow,則快指針追上慢指針,說明該連結清單是循環連結清單。
代碼(别人的):
class NodeCircle:
def __init__(self, val):
self.val = val
self.next = None
def has_circle(self, head):
slow = head
fast = head
while (slow and fast):
fast = fast.next
slow = slow.next
if fast:
fast = fast.next
if fast == slow:
break
if fast and slow and (fast == slow):
return True
else:
return False