Python面試寶典第4題:環形鏈表

題目

????????給你一個鏈表的頭節點 head ,判斷鏈表中是否有環。如果存在環 ,則返回 true 。 否則,返回 false 。

????????如果鏈表中有某個節點,可以通過連續跟蹤 next 指針再次到達,則鏈表中存在環。 為了表示給定鏈表中的環,評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。注意:pos 不作為參數進行傳遞,僅僅是為了標識鏈表的實際情況。

????????示例:

輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。

快慢指針法

????????快慢指針法,也叫Floyd判圈法,是解決鏈表中環檢測問題的經典算法。其核心思想是使用兩個指針,一個快指針每次移動兩個節點,一個慢指針每次移動一個節點。如果鏈表中存在環,快慢指針最終會在環中的某一點相遇。若不存在環,快指針會先到達鏈表尾部。使用快慢指針法求解本題的主要步驟如下。

????????1、初始化指針。開始時,定義兩個指針,一個快指針(fast)和一個慢指針(slow),均指向鏈表的頭節點。

????????2、移動指針。每次迭代時,慢指針(slow)向前移動一步,快指針(fast)向前移動兩步。如果鏈表中存在環,由于快指針移動速度是慢指針的兩倍,最終快指針會追上慢指針。

????????3、終止條件。如果鏈表中沒有環,快指針會首先到達鏈表的尾部(None),這時可以確定鏈表無環。相反,如果快慢指針相遇,則表明鏈表中存在環。

????????根據上面的算法步驟,我們可以得出下面的示例代碼。

class ListNode:def __init__(self, x):self.val = xself.next = Nonedef create_linked_list(length, pos = -1):if length < 1 or (pos != -1 and (pos < 0 or pos >= length)):return Nonehead = ListNode(0)current = headcycle_node = Nonefor i in range(1, length + 1):new_node = ListNode(i)current.next = new_nodecurrent = new_nodeif i == pos + 1:cycle_node = new_node# 只有當pos有效且不為-1時,才創建環if cycle_node:current.next = cycle_node# 返回真正的頭節點,忽略初始的0節點return head.nextdef has_cycle_fast_slow_pointer(head):if head is None or head.next is None:return Falseslow = headfast = head.nextwhile fast is not None and fast.next is not None:if slow == fast:return Trueslow = slow.nextfast = fast.next.nextreturn False# 創建有環鏈表
head_with_cycle = create_linked_list(4, 1)
# 輸出: True
print(has_cycle_fast_slow_pointer(head_with_cycle))# 創建無環鏈表
head_no_cycle = create_linked_list(4, -1)
# 輸出: False
print(has_cycle_fast_slow_pointer(head_no_cycle))

哈希表法

????????哈希表法利用數據結構中的哈希表來記錄每個訪問過的節點。由于哈希表的查找效率非常高,平均時間復雜度為O(1),故我們可以在遍歷鏈表的同時,將每個訪問過的節點添加到哈希表中。當發現某個節點已經被訪問過,即該節點存在于哈希表中時,則可斷定鏈表中存在環。使用哈希表法求解本題的主要步驟如下。

????????1、初始化。創建一個空的哈希表,在Python中,通常是集合set。

????????2、遍歷鏈表。從鏈表頭開始遍歷,對于每一個訪問到的節點,執行以下操作。

????????(1)檢查當前節點是否已經在哈希表中。

????????(2)如果不在,將當前節點添加到哈希表中,并繼續遍歷下一個節點。

????????(3)如果在哈希表中發現了當前節點,說明存在環,直接返回True。

????????3、遍歷結束。如果遍歷完整個鏈表都沒有發現重復的節點,則說明鏈表中沒有環,返回False。

????????根據上面的算法步驟,我們可以得出下面的示例代碼。

def has_cycle_hashset(head):visited_nodes = set()while head is not None:# 如果節點已經在集合中,說明有環if head in visited_nodes:return Truevisited_nodes.add(head)head = head.next# 遍歷結束,沒有發現環return False# 創建有環鏈表
head_with_cycle = create_linked_list(4, 1)
# 輸出: True
print(has_cycle_hashset(head_with_cycle))# 創建無環鏈表
head_no_cycle = create_linked_list(4, -1)
# 輸出: False
print(has_cycle_hashset(head_no_cycle))

總結

????????快慢指針法不需要額外的空間,時間復雜度為O(n),其中n是鏈表中的節點數量。哈希表法則提供了另一種思路,雖然它需要額外的O(n)空間,但優點是實現直觀,易于理解和編碼。

????????在實際應用中,如果對空間復雜度有嚴格要求,推薦使用快慢指針法。如果空間不是問題,而對代碼的簡潔性和直觀性有更高要求,哈希表法也是一個不錯的選擇。

💡 如果想閱讀最新的文章,或者有技術問題需要交流和溝通,可搜索并關注微信公眾號“希望睿智”。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39653.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

重寫父類方法、創建單例對象 題目

題目 JAVA27 重寫父類方法分析&#xff1a;代碼&#xff1a; JAVA28 創建單例對象分析&#xff1a;代碼&#xff1a; JAVA27 重寫父類方法 描述 父類Base中定義了若干get方法&#xff0c;以及一個sum方法&#xff0c;sum方法是對一組數字的求和。請在子類 Sub 中重寫 getX() 方…

AI智能體|AI打工我躺平!使用扣子Coze智能體自動生成和發布文章到微信公眾號(一)

大家好&#xff0c;我是無界生長&#xff0c;國內最大AI付費社群“AI破局俱樂部”初創合伙人。這是我的第 44 篇原創文章——《AI智能體&#xff5c;AI打工我躺平&#xff01;使用扣子Coze智能體自動生成和發布文章到微信公眾號&#xff08;一&#xff09;》 AI智能體&#xf…

《涅朵奇卡:一個女人的一生》讀后感

這周的計劃是看完海明威的《喪鐘為誰而鳴》&#xff0c;但是因為下班晚&#xff0c;而且書的體量大&#xff0c;所以只看了一半。本來以為這周的閱讀計劃完不成了&#xff0c;不料昨天加完班后拿起新到的《涅朵奇卡&#xff1a;一個女人的一生》&#xff0c;不自覺就陷進去了&a…

端口聚合基礎知識

一、什么是端口聚合 端口聚合是將多個物理端口捆綁在一起&#xff0c;形成一個邏輯鏈路&#xff0c;以實現帶寬增加、提高冗余和負載均衡的技術。端口聚合&#xff0c;也稱為以太通道&#xff08;Ethernet Channel&#xff09;&#xff0c;主要用于交換機之間的連接。在具有多…

開發數字藥店APP實戰:互聯網醫院系統源碼詳解

本篇文章&#xff0c;筆者將深入探討如何開發一個功能完善的數字藥店APP&#xff0c;并詳細解析互聯網醫院系統的源碼實現。 一、數字藥店APP的需求分析 應具備以下基本功能&#xff1a; 用戶注冊與登錄 藥品搜索與瀏覽 在線下單與支付 訂單管理 健康咨詢與遠程醫療 個人…

partition()方法——分割字符串為元組

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法參考 partition()方法根據指定的分隔符將字符串進行分割。如果字符串中包含指定的分隔符&#xff0c;則返回一個3元的元組&#xff0c;第一個為…

Perl 語言開發(四):條件語句

目錄 1. 概述 2. if 語句 3. else 語句 4. elsif 語句 5. unless 語句 6. 嵌套條件語句 7. 三元運算符 8. 智能匹配運算符 9. given-when 語句 10. 條件修飾符 11. 高級條件語句應用 11.1 數據驗證 11.2 配置文件解析 11.3 異常處理 12. 條件語句的最佳實踐 12…

Spring Boot+Mybatis Plus 使用Redis實現二級緩存具體步驟以及代碼

下面是使用Spring BootMybatis Plus和Redis實現二級緩存的具體步驟和代碼示例&#xff1a; 1. 首先&#xff0c;確保你已經添加了Spring Boot、Mybatis Plus和Redis的依賴。 2. 在Spring Boot的配置文件中添加Redis的配置&#xff0c;如下所示&#xff1a; yaml spring: r…

wordpress:更新網站域名后后頁面無法訪問,頁面媒體文件異常(已解決)

WordPress 在數據庫中存儲了許多配置信息,包括網站的域名。如果更新了域名,但數據庫中的舊域名沒有更新,WordPress 將無法正確生成頁面鏈接或重定向訪問請求。 一、更新域名 在wp-config.php 文件中,添加或更新你的新域名! define(WP_HOME, http://172.18.214.195:32520…

Linux_fileio學習

參考韋東山老師教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目錄 1. 文件IO函數分類2. 函數原型2.1 系統調用接口2.2 標準IO接口 3. fileio內部機制3.1 系統調用接口內部流程3.1 dup函數使用3.2 dup2函數使用 4. open file4.1 open實例4.2 open函數分析…

Cocos如何跟Android通信?

點擊上方億元程序員+關注和★星標 引言 Cocos如何跟Android通信 大家好,相信小伙伴們通過閱讀筆者前幾期的文章**《Cocos打安卓包打不出來?看看這個》,對Cocos**如何打安卓包有了一定的了解。 但是,除了把安卓包打出來,另外還有一個重要的就是要能夠調用安卓提供的Java方…

華為HCIP Datacom H12-821 卷21

1.單選題 以下關于PIM-SM中SPT切換的描述,錯誤的是哪一項? A、若所有組播流量都經過RP路由器,則RP路由器可能成為數據轉發的瓶頸 B、SPT路徑最短,轉發性能更優 C、SPT 切換完成后,組播流量依然經過 ReT 樹 D、RPT 樹可能不是組播流量轉發的最優路徑 正確答案: C 解析…

【AI原理解析】—K近鄰(KNN)原理

目錄 一、算法概述 二、算法原理 1. 數據集準備 2. 輸入新數據 3. 距離計算 4. 選擇K個最近鄰 5. 預測 三、關鍵要素 1. K值的選擇 2. 距離度量方法 3. 數據預處理 四、算法優缺點 優點 缺點 五、總結 KNN&#xff08;K-Nearest Neighbors&#xff0c;K最近鄰&a…

[教程]Gitee保姆級圖文使用教程

我們在日常的工作過程中經常會遇到&#xff0c;家里和公司資料文件同步的問題&#xff0c;以及項目開發過程中的協作問題。Git就完美的解決了這些問題&#xff0c;但是由于 Git國外服務器的原因平時網絡太慢了&#xff0c;不過還好有國內的托管平臺Gitee&#xff08;碼云&#…

「C++系列」C++ 變量類型

文章目錄 一、C 變量類型1. 基本數據類型2. 復合數據類型3. 類型修飾符 二、C 變量定義案例 1: 基本類型變量的定義和初始化案例 2: 數組的定義和使用案例 3: 結構體&#xff08;Struct&#xff09;的定義和使用案例 4: 指針的定義和使用案例 5: 類的定義和使用&#xff08;面向…

五、removeClosedPointCloud

五、removeClosedPointCloud 主要功能: removeClosedPointCloud 函數用于過濾掉點云中距離傳感器(例如激光雷達)太近的點。這些點可能會引入噪聲或不利于后續的點云處理和分析。函數通過比較每個點與傳感器之間的距離,移除那些距離小于設定閾值 minimumRange 的點。 計算…

網絡連接之隊頭阻塞!!!

一、什么是隊頭阻塞 隊頭阻塞&#xff0c;在網絡模型中簡單理解就是&#xff0c;對于隊列型的請求模型&#xff0c;如HTTP的請求-響應模型、TCP的ACK確認機制&#xff0c;都依賴得到一個具體的響應包&#xff0c;如果收不到這個響應包&#xff0c;那下一個請求就不能發&#x…

4、音視頻封裝格式---FLV

FLV FLV是一種容器封裝格式&#xff0c;是由Adobe公司發布和維護的&#xff0c;用于將視頻編碼流與音頻編碼流進行封裝。對于任意一種封裝格式&#xff0c;都有其頭部區域與數據區域&#xff0c;在FLV中&#xff0c;稱之為FLV Header與Body。 對于FLV Header&#xff0c;一個FL…

python自動移除excel文件密碼(升級v2版本)

歡迎查看第一版 https://blog.csdn.net/weixin_45631815/article/details/140013476?spm1001.2014.3001.5502 一功能改進 此版本主要改進功能有以下: 直接可以調用函數實現可以嘗試多個密碼沒有加密的文件進行保存,可以按實際業務進行改進.思路來源:java 面向對象設計模式.…

煤礦安全大模型:微調internlm2模型實現針對煤礦事故和煤礦安全知識的智能問答

煤礦安全大模型————礦途智護者 使用煤礦歷史事故案例,事故處理報告、安全規程規章制度、技術文檔、煤礦從業人員入職考試題庫等數據,微調internlm2模型實現針對煤礦事故和煤礦安全知識的智能問答。 本項目簡介: 近年來,國家對煤礦安全生產的重視程度不斷提升。為了確…