鏈結串列中的節點可以指向下一個節點或是 None
,如果下一個節點是曾經出現過的節點,那麼我們稱這個鏈結串列包含一個 Cycle
。今天的目標就是來偵測這個鏈結串列是否包含 Cycle
!
先來說說簡單的解法:
但是,我們會需要花很多時間在查閱我們是否走過的這個節點,以及花很多空間在紀錄節點。
那我們換個方式:
這個演算法叫做「Two Pointer
」是運用類似龜兔賽跑的概念,其中一個指標(代號「兔子」)每次走 2 步,另一個指標(代號「烏龜」)每次走 1 步
結果大致可以分成兩種:
None
),代表鏈結串列沒有 Cycle
Cycle
def cycleDetection(self):
rabbit = turtle = self.head
while (rabbit != None and turtle != None):
if (rabbit.next == None):
return False
else:
rabbit = rabbit.next
if (rabbit.next == None):
return False
else:
rabbit = rabbit.next
if (turtle.next == None):
return False
else:
turtle = turtle.next
if rabbit == turtle:
return True
return False
不覺得這個演算法很神奇嗎?
他也只是用了平常能見到的賽跑倒追的概念,但是他去能解決問題!