十二天-雙指針技術:鏈表問題的高效解法

一、雙指針技術分類

1. 同速雙指針(同向移動)

  • 特點:兩個指針以相同速度移動
  • 適用場景
    • 鏈表逆序
    • 查找倒數第 k 個元素
    • 刪除倒數第 n 個節點

2. 快慢雙指針(異速移動)

  • 特點:一個指針每次移動 1 步,另一個移動 2 步
  • 適用場景
    • 檢測鏈表環存在性
    • 計算環入口和長度
    • 尋找中間節點

二、典型應用與算法實現

2.1 鏈表逆序

方法一:迭代法(同速雙指針)

python

def reverseList(head):prev = Nonecurr = headwhile curr:next_node = curr.next  # 保存后續節點curr.next = prev       # 反轉指針方向prev = curr            # 雙指針同步移動curr = next_nodereturn prev  # prev最終指向新頭節點

  • 復雜度:O (n) 時間,O (1) 空間
方法二:遞歸法

python

def reverseList(head):if not head or not head.next:return headnew_head = reverseList(head.next)head.next.next = headhead.next = Nonereturn new_head

  • 復雜度:O (n) 時間,O (n) 空間(遞歸棧)

2.2 查找倒數第 k 個元素

python

def findKthFromEnd(head, k):slow = fast = head# 快指針先走k步for _ in range(k):fast = fast.next# 雙指針同步移動while fast:slow = slow.nextfast = fast.nextreturn slow.val

  • 關鍵點:快慢指針間距保持 k,當快指針到達末尾時,慢指針指向目標節點

2.3 刪除倒數第 n 個節點

python

def removeNthFromEnd(head, n):dummy = ListNode(0, head)first = dummysecond = dummy# 快指針先走n+1步for _ in range(n+1):first = first.next# 同步移動直到快指針到達末尾while first:first = first.nextsecond = second.next# 刪除操作second.next = second.next.nextreturn dummy.next

  • 技巧:使用虛擬頭節點避免處理頭節點刪除的邊界情況

2.4 檢測鏈表環存在性

python

def hasCycle(head):slow = fast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast:return Truereturn False

  • 原理:若存在環,快慢指針必然相遇

2.5 計算環入口和長度

python

def detectCycle(head):# 第一步:檢測是否存在環slow = fast = headhas_cycle = Falsewhile fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast:has_cycle = Truebreakif not has_cycle:return None# 第二步:找到環入口ptr1 = headptr2 = slowwhile ptr1 != ptr2:ptr1 = ptr1.nextptr2 = ptr2.nextreturn ptr1def calculateCycleLength(head):# 先找到環內節點slow = fast = headwhile fast and fast.next:slow = slow.nextfast = fast.next.nextif slow == fast:break# 計算環長度count = 0while True:slow = slow.nextcount += 1if slow == fast:breakreturn count

三、算法復雜度對比

問題類型雙指針方法時間復雜度空間復雜度優勢
鏈表逆序迭代O(n)O(1)無棧溢出風險
查找倒數第 k 元素快慢指針O(n)O(1)僅需一次遍歷
刪除倒數第 n 節點快慢指針O(n)O(1)無需預先計算長度
檢測環存在性快慢指針O(n)O(1)最優解法
環入口定位雙指針定位O(n)O(1)Floyd 判圈算法變種

四、優化建議與應用場景

1. 優化技巧

  • 虛擬頭節點:處理頭節點刪除時,避免復雜的邊界判斷
  • 指針間距控制:通過調整快慢指針的初始間距,解決不同問題
  • 兩次遍歷:在檢測環問題中,先用快慢指針檢測環,再用同速指針定位入口

2. 典型應用場景

  • 鏈表操作:LeetCode 206(反轉鏈表)、19(刪除倒數第 N 個節點)
  • 環檢測:LeetCode 141(環形鏈表)、142(環形鏈表 II)
  • 數組問題:雙指針法解決兩數之和、三數之和等問題

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

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

相關文章

【vllm】Qwen2.5-VL-72B-AWQ 部署記錄

版本:0.7.2 注意事項: export LD_LIBRARY_PATH/home/xxxxx/anaconda3/envs/xxxxx/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH # 如果報錯可能需要Also pip install --force-reinstall githttps://github.com/huggingface/tra…

深度學習與大模型-張量

大家好!今天我們來聊聊張量(Tensor)。別被這個詞嚇到,其實它沒那么復雜。 什么是張量? 簡單來說,張量就是一個多維數組。你可以把它看作是一個裝數據的容器,數據的維度可以是一維、二維&#…

【前端面試題】Vu3常見的面試題

1.Vue3與 Vue2的核心區別有哪些? ? 響應式系統 ?: ? Vue2:通過Object.defineProperty 實現響應式。這種方式在處理對象屬性的添加和刪除時存在局限性,且無法直接監控數組的變化 ?;?Vue3:采用Proxy 實現響應式&…

Android 粘包與丟包處理工具類:支持多種粘包策略的 Helper 實現

在Android開發中,處理TCP/UDP通信時,粘包和丟包是常見的問題。粘包是指多個數據包被接收方一次性接收,導致數據包之間的界限不清晰;丟包則是指數據包在傳輸過程中丟失。為了處理這些問題,我們可以編寫一個幫助類 Packe…

【C++11】移動語義

回顧 const int c的c是可以被取地址的,盡管是常量。所以以是否為常量來判斷是否為右值是錯誤的。 左值與右值正確的區分方法是是否能夠被取地址。(能被取地址也就代表著是一個持久狀態,即有持久的存儲空間的值) 常見的左值有我們…

LangChain教程 - Agent -之 ZERO_SHOT_REACT_DESCRIPTION

在構建智能 AI 助手時,我們希望模型能夠智能地調用工具,以便提供準確的信息。LangChain 提供了 AgentType.ZERO_SHOT_REACT_DESCRIPTION,它結合了 ReAct(Reasoning Acting)策略,使得 LLM 可以基于工具的描…

移動Android和IOS自動化中常見問題

APP測試邏輯 在app編寫自動化測試用例時,通常會出現只是簡單的點點點過程,然而卻忽略了在實際的自動化實現過程中,軟件是對app元素的判斷來執行測試腳本。所以會出現在后期已經寫好自動化腳本之后還會對測試用例的更新。 App在測試時&#…

python高效試用17---兩個字符串組成一個新的字符串和兩個字符串組成元組作為key哪個更高效

在 Python 中,使用字符串連接 (str1 str2) 作為 key 和使用元組 ((str1, str2)) 作為 key 的效率差異,主要受以下因素影響: 哈希計算速度: 字符串連接 (str1 str2):會創建一個新的字符串對象,并計算哈希…

深入淺出Java try-with-resources:告別資源泄漏的煩惱

一、為什么需要try-with-resources? 在Java開發中,我們經常需要處理各種資源:文件流、數據庫連接、網絡套接字等。這些資源都有一個共同特點——必須在使用后正確關閉。傳統的資源管理方式存在三大痛點: 代碼臃腫:每…

Python+DeepSeek:開啟AI編程新次元——從自動化到智能創造的實戰指南

文章核心價值 技術熱點:結合全球最流行的編程語言與國產頂尖AI模型實用場景:覆蓋代碼開發/數據分析/辦公自動化等高頻需求流量密碼:揭秘大模型在編程中的創造性應用目錄結構 環境搭建:5分鐘快速接入DeepSeek場景一:AI輔助代碼開發(智能補全+調試)場景二:數據分析超級助…

Linux tcpdump -any抓的包轉換成標準的pcap

在 Linux 中使用 tcpdump -any 抓包并轉換為標準 pcap 文件時出現額外字段,通常與 鏈路層協議頭部的差異 以及 pcap 文件格式的兼容性 有關。以下是詳細原因和解決方案: 一、問題原因分析 -any 選項的局限性 tcpdump -any 會自動猜測鏈路層協議類型(如 Ethernet、IEEE 802…

【SpringMVC】深入解析使用 Postman 在請求中傳遞對象類型、數組類型、參數類型的參數方法和后端參數重命名、及非必傳參數設置的方法

SpringMVC—請求傳參 1. 傳遞對象 如果參數比較多時,方法聲明就需要有很多形參;并且后續每次新增一個參數,也需要修改方法聲明. 我們不妨把這些參數封裝為一個對象; Spring MVC 也可以自動實現對象參數的賦值,比如 Us…

一個差勁的軟件設計

項目概況: 之前自己設計并開發了一個用C#開發的上位機軟件,整個軟件只有一個Form,一個TabControl,3個TabControlPanel,總共100多個lable、textbox、ListBox等控件都放在這3個TabControlPanel里。 問題: 1.…

Linux練級寶典->進程控制詳解(進程替換,fork函數)

目錄 進程創建 fork函數 寫時拷貝 進程終止 進程退出碼 exit函數 _exit函數 return,exit _exit之間的區別和聯系 進程等待 進程等待的必要性 獲取子進程status 進程等待的方法 wait waipid 多子進程創建理解 非阻塞輪詢檢測子進程 進程程序替換 替…

RabbitMq--消息可靠性

12.消息可靠性 1.消息丟失的情況 生產者向消息代理傳遞消息的過程中,消息丟失了消息代理( RabbitMQ )把消息弄丟了消費者把消息弄丟了 那怎么保證消息的可靠性呢,我們可以從消息丟失的情況入手——從生產者、消息代理&#xff0…

Windows中在VSCode/Cursor上通過CMake或launch文件配置CUDA編程環境

前置步驟 安裝符合GPU型號的CUDA Toolkit 配置好 nvcc 環境變量 安裝 Visual Studio 參考https://blog.csdn.net/Cony_14/article/details/137510909 VSCode 安裝插件 Nsight Visual Studio Code Edition 注意:不是vscode-cudacpp。若兩個插件同時安裝,…

Spark(8)配置Hadoop集群環境-使用腳本命令實現集群文件同步

一.hadoop的運行模式 二.scp命令————基本使用 三.scp命令———拓展使用 四.rsync遠程同步 五.xsync腳本集群之間的同步 一.hadoop的運行模式 hadoop一共有如下三種運行方式: 1. 本地運行。數據存儲在linux本地,測試偶爾用一下。我們上一節課使用…

聚焦兩會:科技與發展并進,賽逸展2025成創新新舞臺

在十四屆全國人大三次會議和全國政協十四屆三次會議期間,代表委員們圍繞多個關鍵議題展開深入討論,為國家未來發展謀篇布局。其中,技術競爭加劇與經濟轉型需求成為兩會焦點,將在首都北京舉辦的2025第七屆亞洲消費電子技術貿易展&a…

【音視頻】ffmpeg命令提取像素格式

1、提取YUV數據 提取yuv數據,并保持分辨率與原視頻一致 使用-pix_fmt或-pixel_format指定yuv格式提取數據,并保持原來的分辨率 ffmpeg -i music.mp4 -t "01:00" -pixel_format yuv420p music.yuv提取成功后,可以使用ffplay指定y…

【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP)

【從零開始學習計算機科學】【從零開始學習計算機科學】計算機體系結構(二)指令級并行(ILP) ILP流水線(pipeline)流水線調度循環展開和循環流水循環展開。循環展開的具體步驟可以描述為,軟件流水(循環流水)。我們可以通過流水線的思想處理循環的執行,即不需要這一次的…