天天看點

快慢指針(找未知長度連結清單的中間、判斷連結清單是否是循環連結清單)

快慢指針也是一個可以用于很多問題的技巧。所謂快慢指針中的快慢指的是指針向前移動的步長,每次移動的步長較大即為快,步長較小即為慢,常用的快慢指針一般是在單連結清單中讓快指針每次向前移動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
           

繼續閱讀