快慢指針【等分鏈表、判斷鏈表中是否存在環】

一、等分鏈表:找到鏈表的中間節點

Java 實現
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}
}public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head == null) {return null;}ListNode slow = head;ListNode fast = head;// 快指針每次走兩步,慢指針每次走一步while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}// 慢指針指向中間節點return slow;}public static void main(String[] args) {// 示例鏈表:1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);MiddleOfLinkedList solution = new MiddleOfLinkedList();ListNode middle = solution.findMiddleNode(head);System.out.println("中間節點值: " + middle.val); // 輸出: 3}
}
示例

輸入鏈表:1 -> 2 -> 3 -> 4 -> 5
輸出:3

輸入鏈表:1 -> 2 -> 3 -> 4 -> 5 -> 6
輸出:4


二、判斷鏈表中是否存在環

Java 實現
class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}
}public class LinkedListCycle {public ListNode detectCycle(ListNode head) {if (head == null || head.next == null) {return null;}ListNode slow = head;ListNode fast = head;// 判斷是否有環while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 快慢指針相遇,說明有環if (slow == fast) {break;}}// 無環if (fast == null || fast.next == null) {return null;}// 找到環的入口fast = head;while (fast != slow) {fast = fast.next;slow = slow.next;}return slow;}public static void main(String[] args) {// 示例鏈表:1 -> 2 -> 3 -> 4 -> 5 -> 2(節點5指向節點2,形成環)ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);head.next.next.next.next.next = head.next; // 形成環LinkedListCycle solution = new LinkedListCycle();ListNode cycleNode = solution.detectCycle(head);if (cycleNode != null) {System.out.println("環的入口節點值: " + cycleNode.val); // 輸出: 2} else {System.out.println("鏈表中無環");}}
}
示例

輸入鏈表:1 -> 2 -> 3 -> 4 -> 5 -> 2(節點5指向節點2,形成環)
輸出:2

輸入鏈表:1 -> 2 -> 3 -> 4 -> 5
輸出:鏈表中無環


三、核心思想總結

  1. 快慢指針的速度差

    • 快指針每次移動兩步,慢指針每次移動一步;
    • 在等分鏈表中,快指針到達末尾時,慢指針正好在中間;
    • 在判斷環時,快指針會追上慢指針。
  2. 時間復雜度

    • 等分鏈表:O(n),其中 n 是鏈表長度;
    • 判斷環:O(n),最多遍歷鏈表兩次。
  3. 空間復雜度O(1),只使用了常數級別的額外空間。


四、練習題

  1. 等分鏈表

    • 輸入:1 -> 2 -> 3 -> 4 -> 5 -> 6
    • 輸出:4
  2. 判斷環

    • 輸入:1 -> 2 -> 3 -> 4 -> 5 -> 3(節點5指向節點3,形成環)
    • 輸出:3

通過 Java 實現 快慢指針技巧,可以高效解決鏈表中的常見問題。掌握這一技巧,鏈表問題將不再是難題!

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

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

相關文章

系統架構設計師—計算機基礎篇—計算機網絡

文章目錄 網絡互聯模型網絡協議與標準應用層協議FTP協議TFTP協議 HTTP協議HTTPS協議 DHCP動態主機配置協議DNS協議迭代查詢遞歸查詢 傳輸層協議網絡層協議IPV4協議IPV6協議IPV6數據報的目的地址IPV4到IPV6的過渡技術 網絡設計分層設計接入層匯聚層核心層 網絡布線綜合布線系統工…

計算機基礎面試(操作系統)

操作系統 1. 什么是進程和線程?它們的核心區別是什么? 專業解答: 進程是操作系統分配資源的基本單位,擁有獨立的內存空間;線程是進程內的執行單元,共享同一進程的資源。區別在于:進程間資源隔離…

考研408數據結構線性表核心知識點與易錯點詳解(附真題示例與避坑指南)

一、線性表基礎概念 1.1 定義與分類 定義:線性表是由n(n≥0)個相同類型數據元素構成的有限序列,元素間呈線性關系。 分類: 順序表:元素按邏輯順序存儲在一段連續的物理空間中(數組實現&…

【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-1.2.2倒排索引原理與分詞器(Analyzer)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 文章大綱 1.2.2倒排索引原理與分詞器(Analyzer)1. 倒排索引:搜索引擎的基石1.1 正排索引 vs 倒排索引示例數據對比: 1.2 倒排索引核心結…

Springboot項目本地連接并操作MySQL數據庫

目錄 前提 準備工作 用cmd在本地創建數據庫、表: 1.創建springboot項目(已有可跳過) 2.編輯Mybatis配置 3.連接數據庫 4.創建模型類,用于與數據庫里的數據表相連 5.創建接口mapper,定義對數據庫的操作 6.創建…

《寶塔 Nginx SSL 端口管理實戰指南:域名解析、端口沖突與后端代理解析》

📢 Nginx & SSL 端口管理分析 1?? 域名解析與 SSL 申請失敗分析 在使用寶塔申請 www.mywebsite.test 的 SSL 證書時,遇到了解析失敗的問題。最初,我認為 www 只是一個附加的前綴,不屬于域名的關鍵部分,因此只為…

java和Springboot和vue開發的企業批量排班系統人臉識別考勤打卡系統

演示視頻: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理員管理員工,采集員工人臉特征值存入數據庫,可選擇多個員工批量排班…

DeepSeek學習規劃

DeepSeek是一個專注于深度學習和人工智能技術研究與應用的平臺,旨在通過系統化的學習和實踐,幫助用戶掌握深度學習領域的核心知識和技能。為了在DeepSeek平臺上高效學習,制定一個科學合理的學習規劃至關重要。以下是一個詳細的學習規劃&#…

打開 Windows Docker Desktop 出現 Docker Engine Stopped 問題

一、關聯文章: 1、Docker Desktop 安裝使用教程 2、家庭版 Windows 安裝 Docker 沒有 Hyper-V 問題 3、安裝 Windows Docker Desktop - WSL問題 二、問題解析 打開 Docker Desktop 出現問題,如下: Docker Engine Stopped : Docker引擎停止三、解決方法 1、檢查服務是否…

突破Ajax跨域困境,解鎖前端通信新姿勢

一、引言 在當今的 Web 開發領域,前后端分離的架構模式已經成為主流,它極大地提升了開發效率和項目的可維護性。在這種開發模式下,前端通過 Ajax 技術與后端進行數據交互,然而,跨域問題卻如影隨形,成為了開…

Mercury、LLaDA 擴散大語言模型

LLaDA 參考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在線demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在線demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust語言圣經中定義 str Rust 語言類型大致分為兩種:基本類型和標準庫類型,前者由語言特性直接提供,后者在標準庫中定義 str 是唯一定義在 Rust 語言特性中的字符串,但也是幾乎不會用到的字符串類型 str 字符串是 DST 動態大小…

大數據SQL調優專題——底層調優

引入 上一篇我們提到了調優的常見切入點,核心就是通過數據產出情況發現問題,借助監控等手段收集信息排查瓶頸在哪,最后結合業務理解,等價重寫思路去解決問題。 在實際工作場景中,去保證數據鏈路產出SLA的時候&#x…

Hue 編譯異常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

個人博客地址:Hue 編譯異常:ImportError: cannot import name six from urllib3.packages | 一張假鈔的真實世界 在編譯Hue的時候出現錯誤信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…

計算機網絡——詳解TCP三握四揮

文章目錄 前言一、三次握手1.1 三次握手流程1.2 tcp為什么需要三次握手建立連接? 二、四次揮手2.1 四次揮手流程2.2 為什么是四次,不是三次?2.3 為什么要等待2msl?2.4 TCP的保活計時器 前言 TCP和UDP是計算機網絡結構中運輸層的兩…

# C# 中堆(Heap)與棧(Stack)的區別

在 C# 中,堆和棧是兩種不同的內存分配機制,它們在存儲位置、生命周期、性能和用途上存在顯著差異。理解堆和棧的區別對于優化代碼性能和內存管理至關重要。 1. 棧(Stack) 1.1 定義 棧是一種后進先出(LIFO&#xff0…

如何把圖片或者圖片地址存到 MySQL 數據庫中以及如何將這些圖片數據通過 JSP 顯示在網頁中

如何優雅地管理圖片:從MySQL數據庫存儲到JSP展示的全流程解析 在互聯網時代,一張引人入勝的圖片往往能為網站帶來巨大的流量。而作為開發者的我們,如何高效地管理和展示這些圖片資源則成為了一項重要的技術挑戰。今天,我們就一起…

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載 在游戲和視頻播放時,你是否遇到過分辨率不匹配、畫質模糊的問題?今天給大家介紹一款神器——Lossless Scaling(拼好幀),也被玩家們親切地稱為“小黃鴨”&#xff0…

科普|無人機專業術語

文章目錄 前言一、飛控二、電調三、通道四、2S、3S、4S電池五、電池后面C是什么意思?六、電機的型號七、什么是電機的KV值?八、螺旋槳的型號九、電機與螺旋槳的搭配 前言 無人機飛控系統控制飛行姿態,電調控制電機轉速,遙控器通道控制飛行動作。電池C…

和鯨科技攜手四川氣象,以 AI 的力量賦能四川氣象一體化平臺建設

氣象領域與農業、能源、交通、環境科學等國計民生關鍵領域緊密相連,發揮著不可替代的重要作用。人工智能技術的迅猛發展,為氣象領域突破困境帶來了新的契機。AI 技術能夠深度挖掘氣象大數據中蘊含的復雜信息,助力人類更精準地把握自然規律&am…