快慢指針算法(Floyd 判圈算法)

快慢指針(又稱龜兔賽跑算法)是一種常用的鏈表操作技巧,通過兩個移動速度不同的指針遍歷鏈表,用于解決鏈表中環檢測、中點查找等問題。以下是其核心應用場景和實現方法:

1. 鏈表環檢測
  • 問題描述: 判斷鏈表中是否存在環。

  • 算法思路:

    • 慢指針(slow)每次移動 1 步。
    • 快指針(fast)每次移動 2 步。
    • 若存在環,快指針會追上慢指針(即相遇,slow == fast)。
    • 若無環,快指針會先到達鏈表尾部(null)。
  • 代碼實現:

    function hasCycle(head) {if (!head) return false;let slow = head;let fast = head.next;while (slow !== fast) {if (!fast || !fast.next) return false;slow = slow.next;fast = fast.next.next;}return true;
    }
    
  • 復雜度分析:

    • 時間復雜度: O (n),快指針最多遍歷 2n 步。
    • 空間復雜度: O (1),僅需兩個指針。
2. 尋找鏈表中點
  • 問題描述: 找到鏈表的中間節點(若節點數為偶數,返回中間兩個節點的任意一個)。

  • 算法思路:

    • 慢指針每次移動 1 步。
    • 快指針每次移動 2 步。
    • 當快指針到達尾部時,慢指針恰好位于中點。
  • 代碼實現:

    function middleNode(head) {let slow = head;let fast = head;while (fast && fast.next) {slow = slow.next;fast = fast.next.next;}return slow;
    }
    

3. 尋找環的入口節點

  • 問題描述:若鏈表存在環,找到環的入口節點。

  • 算法思路:

    • 步驟 1: 使用快慢指針判斷是否存在環,并找到相遇點。
    • 步驟 2: 相遇后,將慢指針重新指向頭節點,快指針保持在相遇點。
    • 步驟 3: 慢指針和快指針同時移動 1 步,再次相遇的位置即為環的入口。
  • 代碼實現:

    function detectCycle(head) {if (!head) return null;let slow = head;let fast = head;// 找到相遇點while (fast && fast.next) {slow = slow.next;fast = fast.next.next;if (slow === fast) break;}// 若無環,返回nullif (!fast || !fast.next) return null;// 慢指針回到頭節點,再次相遇即為入口slow = head;while (slow !== fast) {slow = slow.next;fast = fast.next;}return slow;
    }
    
4. 鏈表倒數第 k 個節點
  • 問題描述: 找到鏈表的倒數第 k 個節點。

  • 算法思路:

    • 快指針先移動 k 步。
    • 慢指針和快指針同時移動 1 步,直到快指針到達尾部。
    • 此時慢指針即為倒數第 k 個節點。
  • 代碼實現:

    function findKthFromEnd(head, k) {let slow = head;let fast = head;// 快指針先走k步for (let i = 0; i < k; i++) {if (!fast) return null;fast = fast.next;}// 同步移動至快指針到達尾部while (fast) {slow = slow.next;fast = fast.next;}return slow;
    }
    
總結
  • 快慢指針算法通過速度差,巧妙地解決了鏈表中的多種問題。其核心在于:

    • 環檢測:快慢指針相遇則有環。
    • 中點查找:快指針到尾時慢指針在中點。
    • 環入口定位:相遇點和頭節點同時移動再次相遇處。
    • 倒數第 k 個節點:快指針先走 k 步后同步移動。

該算法時間復雜度均為 O (n),空間復雜度為 O (1),是鏈表操作中的經典技巧。

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

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

相關文章

獨立開發者利用AI工具快速制作產品MVP

在當今快速發展的科技時代&#xff0c;獨立開發者面臨著前所未有的機遇與挑戰。曾經需要花費數天甚至數周才能完成的產品MVP&#xff08;Minimum Viable Product&#xff0c;最小可行性產品&#xff09;&#xff0c;如今借助強大的AI工具&#xff0c;可以在短短1小時內實現。 …

Spark處理過程-轉換算子和行動算子

&#xff08;一&#xff09;RDD的處理過程 RDD經過一系列的“轉換”操作&#xff0c;每一次轉換都會產生不同的RDD&#xff0c;以供給下一次“轉換”操作使 用&#xff0c;直到最后一個RDD經過“行動”操作才會真正被計算處理。 1.延遲。RDD中所有的轉換都是延遲的&…

設置環境變量啟動jar報

1. 環境變量設置 set PATHC:\Program Files\java17\jdk-17.0.9\bin;%PATH%2. 啟動jar java -jar jar包名3. 記錄原因 PATH路徑前添加java執行文件路徑才會管用。添加后可以試試以下命令 直接輸入PATH 回車 PATH進行java版本測試 java -version

589. N叉樹的前序遍歷迭代法:null指針與棧的巧妙配合

一、題目描述 給定一個N叉樹的根節點&#xff0c;返回其節點值的前序遍歷結果。前序遍歷的定義是&#xff1a;先訪問根節點&#xff0c;再依次遍歷每個子節點&#xff08;從左到右&#xff09;。例如&#xff0c;對于如下N叉樹&#xff1a; 1/ | \3 2 4 / \ 5 6前序遍歷結果…

顯性知識的主要特征

有4個主要特征&#xff1a; 客觀存在性靜態存在性可共享性認知元能性

奧運數據可視化:探索數據講述奧運故事

在數據可視化的世界里&#xff0c;體育數據因其豐富的歷史和文化意義&#xff0c;常常成為最有吸引力的主題之一。今天我要分享一個令人著迷的奧運數據可視化項目&#xff0c;它巧妙地利用交互式圖表和動態動畫&#xff0c;展現了自1896年至今奧運會的發展歷程和各國奧運成就的…

Mysql存儲過程(附案例)

? 文章目錄 存儲過程概述1、基本語法2、變量①、系統變量②、用戶自定義變量③、局部變量 3、流程控制語句①、if語句②、參數③、case語句④、while語句⑤、repeat語句⑥、loop語句⑦、cursor游標⑧、handler 4、存儲函數 存儲過程概述 存儲過程是事先經過編譯并存儲在數據…

小波變換+注意力機制成為nature收割機

小波變換作為一種新興的信號分析工具&#xff0c;能夠高效地提取信號的局部特征&#xff0c;為復雜數據的處理提供了有力支持。然而&#xff0c;它在捕捉數據中最為關鍵的部分時仍存在局限性。為了彌補這一不足&#xff0c;我們引入了注意力機制&#xff0c;借助其能夠強化關注…

SQLMesh 增量模型從入門到精通:5步實現高效數據處理

本文深入解析 SQLMesh 中的增量時間范圍模型&#xff0c;介紹其核心原理、配置方法及高級特性。通過實際案例說明如何利用該模型提升數據加載效率&#xff0c;降低計算資源消耗&#xff0c;并提供配置示例與最佳實踐建議&#xff0c;幫助讀者在實際項目中有效應用這一強大功能。…

Android應用內存分析與優化 - 工具篇之Booster

序 在原理篇中&#xff0c;我們發現在App內存的分布中&#xff0c;Code是占大頭的部分&#xff0c;所以我們可以從App體積方面想辦法&#xff0c;通過減小App體積達到降低內存的目的&#xff0c;同時&#xff0c;根據權威的機構分析&#xff0c;體積與用戶下載和留存有很大的聯…

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間&#xff1a;2025年12月2-4日 地點&#xff1a;上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模&#xff0c;預設展位1200個&#xff0c;將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫&#xff0c;通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源&#xff1a;整個應用的狀態被存儲在一個唯一的Store對象中&#xff0c;所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生&#xff1a;繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上&#xff0c;針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決&#xff1a;安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped&#xff01;個人環境介紹自己的解決問題思路&#xff08;詳細過程附截圖&#xff09;1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…

PCIE接收端檢測機制分析

PCIE接收端檢測機制分析 1、PCIE的接收端檢測機制 接收器檢測電路作為發射器的一部分實現&#xff0c;必須正確檢測是否存在與ZRX-DC參數&#xff08;40Ω-60Ω&#xff09;隱含的直流阻抗等效的負載阻抗。 接收器檢測序列的推薦行為如下&#xff1a; ?初始狀態?&#xff…

[模型部署] 3. 性能優化

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

InternVL3: 利用AI處理文本、圖像、視頻、OCR和數據分析

InternVL3推動了視覺-語言理解、推理和感知的邊界。 在其前身InternVL 2.5的基礎上,這個新版本引入了工具使用、GUI代理操作、3D視覺和工業圖像分析方面的突破性能力。 讓我們來分析一下是什么讓InternVL3成為游戲規則的改變者 — 以及今天你如何開始嘗試使用它。 InternVL…