成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 鏈表面試題精講:如何判斷鏈表是否有環?如何找出環的入口節點?

開發
今天我們就來剖析一道經典題目:如何判斷一個鏈表是否有環? 如果你掌握了這一技巧,那下一步你應該深入學習:如何找到環的入口節點?

在 Python 面試中,鏈表的基礎題型幾乎每次都出現。今天我們就來剖析一道經典題目:如何判斷一個鏈表是否有環? 如果你掌握了這一技巧,那下一步你應該深入學習:如何找到環的入口節點?

問題描述

給定一個單向鏈表的頭節點 head,判斷鏈表中是否存在環,如果存在,請返回環的起始節點。

解法一:判斷鏈表是否有環(快慢指針)

首先我們使用**快慢指針(Floyd 判圈算法)**來判斷鏈表是否有環:

  • slow 每次走一步
  • fast 每次走兩步
  • 如果兩者在某個節點相遇,就說明存在環
def has_cycle(head: ListNode) -> bool:
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False

解法二:找出環的入口(重點)

當快慢指針相遇之后,說明鏈表中存在環。此時我們可以使用如下方法找出環的起點(入口):

步驟解析:

  • 讓其中一個指針(如 slow)回到鏈表頭 head;
  • 然后兩個指針都改為每次走一步;
  • 當兩個指針再次相遇時,就是環的入口。

原理解釋:

設:

  • a 是頭節點到環入口的長度;
  • b 是環入口到相遇點的長度;
  • c 是環剩下的長度(使得一圈為 b + c);

因為快指針走的距離是慢指針的兩倍:

2(a + b) = a + b + n(b + c)
推導得:a = c + (n - 1)(b + c)

說明從頭節點走 a 步、從相遇點走 c 步,兩者會在環的入口節點重合。

完整代碼實現

class ListNode:
    def __init__(self, val=0):
        self.val = val
        self.next = None

def detect_cycle(head: ListNode) -> ListNode:
    """
    檢測鏈表中的環,返回環的起始節點。如果無環返回 None。
    """
    slow = fast = head

    # 第一步:判斷是否有環
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break
    else:
        return None  # 無環

    # 第二步:找環的入口
    slow = head
    while slow != fast:
        slow = slow.next
        fast = fast.next

    return slow  # 即為環的起始節點

測試樣例

# 創建一個環形鏈表:1 -> 2 -> 3 -> 4 -> 5 -> 3(回到節點3)

node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node3  # 形成環,入口是node3

entry = detect_cycle(node1)
print(entry.val if entry else "無環")  # 輸出:3

小結與面試建議

面試點

內容說明

判斷有無環

快慢指針,相遇則有環

找到環入口

相遇后讓一指針回頭,兩個再同步前進

時間復雜度

O(n)

空間復雜度

O(1)

這道題常被用于考察鏈表的操作能力、指針思維和空間復雜度控制能力,理解 Floyd 判圈算法對于高級題型也是非常有幫助的。

責任編輯:趙寧寧 來源: Ssoul肥魚
相關推薦

2023-07-27 07:28:04

存儲鏈表HashSet

2022-04-07 08:37:05

鏈表技巧單鏈表

2021-10-28 11:40:58

回文鏈表面試題數據結構

2021-05-31 18:47:04

環形鏈表哈希

2020-04-24 09:47:39

Python數據增長率

2013-10-16 16:15:26

單鏈表

2025-02-11 07:40:27

2025-06-04 08:40:00

Go語言鏈表

2021-11-02 10:10:38

面試元素語言

2019-06-05 07:47:32

Nginx高并發多線程

2018-04-13 14:53:13

PythonMySQL爬蟲

2014-09-19 11:17:48

面試題

2020-06-04 14:40:40

面試題Vue前端

2021-01-26 05:21:29

無序鏈表HashSet

2017-09-13 07:15:10

Python讀寫文件函數

2023-05-19 08:21:40

MarginCSS

2015-09-07 09:15:54

Java面試題HashMap

2021-06-05 13:44:08

遞歸策略鏈表

2023-11-13 07:37:36

JS面試題線程

2011-03-24 13:27:37

SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操狠狠操 | 天天操夜夜操 | 精品国产乱码久久久久久蜜臀 | 国产亚洲欧美在线 | 一区二区三区电影网 | 精品一区二区三区四区视频 | 色资源在线| 亚洲综合热 | 亚洲成人中文字幕 | 天天插天天舔 | 精品国产91亚洲一区二区三区www | 一级片视频免费 | 日韩成人在线视频 | 9999视频 | 宅男噜噜噜66一区二区 | 最近免费日本视频在线 | 欧美成人综合 | 色在线视频网站 | 亚洲网在线| 亚洲理论在线观看电影 | 丝袜天堂| 91网在线观看 | 毛片一区二区三区 | 久久国产电影 | 国户精品久久久久久久久久久不卡 | 中文字幕日韩欧美一区二区三区 | 久久99精品久久久久久秒播九色 | 亚洲精品久久久久久国产精华液 | 午夜视频精品 | 日韩成人在线视频 | 精品欧美色视频网站在线观看 | 亚洲精品99 | 污免费网站 | 91精品国产综合久久福利软件 | 欧美大片一区二区 | 国产一区二区在线免费播放 | 最近最新中文字幕 | 久久精品视频在线观看 | 久久久久久久久久久久久久久久久久久久 | 国产精品日产欧美久久久久 | 黄色av免费|