iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Software Development

闖進Python異世界系列 第 18

[Day 18] 闖進Python異世界 - Cycle Detection

  • 分享至 

  • xImage
  •  

鏈結串列中的節點可以指向下一個節點或是 None,如果下一個節點是曾經出現過的節點,那麼我們稱這個鏈結串列包含一個 Cycle 。今天的目標就是來偵測這個鏈結串列是否包含 Cycle


先來說說簡單的解法:

  1. 把走過的節點紀錄在一個容器中,如:列表
  2. 每走過一個節點就進行判斷這個節點是否走過

但是,我們會需要花很多時間在查閱我們是否走過的這個節點,以及花很多空間在紀錄節點。


那我們換個方式:
這個演算法叫做「Two Pointer」是運用類似龜兔賽跑的概念,其中一個指標(代號「兔子」)每次走 2 步,另一個指標(代號「烏龜」)每次走 1 步
結果大致可以分成兩種:

  1. 兔子指標抵達鏈結串列終點(None),代表鏈結串列沒有 Cycle
  2. 兔子指標與烏龜指標相遇,代表鏈結串列包含 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

不覺得這個演算法很神奇嗎?
他也只是用了平常能見到的賽跑倒追的概念,但是他去能解決問題!


上一篇
[Day 17] 闖進Python異世界 - Singly Linked List 3/3
下一篇
[Day 19] 闖進Python異世界 - Palindrome Linked List
系列文
闖進Python異世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言