【LeetCode 熱題 100】24. 兩兩交換鏈表中的節點——(解法一)迭代+哨兵

Problem: 24. 兩兩交換鏈表中的節點
題目:給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決一個經典的鏈表操作問題:兩兩交換鏈表中的節點 (Swap Nodes in Pairs)。問題要求將鏈表中每兩個相鄰的節點進行交換,并返回交換后的鏈表。例如,1->2->3->4 應變為 2->1->4->3

該算法采用了一種 迭代 的方法,通過精心設計的指針操作來完成節點的交換。為了簡化邊界情況(特別是頭節點的交換),它也巧妙地運用了 哨兵節點 (Sentinel Node)

其核心邏輯步驟如下:

  1. 初始化

    • 哨兵節點:創建一個 dummy 節點,其 next 指向原始鏈表的頭節點 head。這使得對第一對節點的交換與其他節點的交換邏輯完全統一。
    • 指針設置
      • left 指針:初始化為 dummy。這個指針將始終指向待交換的一對節點的前一個節點。它的作用是連接上一組交換好的部分和當前正在交換的部分。
      • right 指針:初始化為 head。這個指針將始終指向待交換的一對節點中的第一個節點
  2. 迭代交換

    • 算法使用一個 while 循環來遍歷并交換節點對。
    • 循環條件while (null != right && null != right.next)。這個條件確保了至少還有一對完整的節點(rightright.next)可供交換。如果鏈表為空、只有一個節點,或者只剩最后一個節點,循環都不會執行。
    • 在循環內部(核心交換邏輯)
      • 假設當前結構是 ... -> left -> right -> right.next -> ...。目標是變為 ... -> left -> right.next -> right -> ...
      • left.next = right.next;:首先,將 leftnext 指針指向 right 的下一個節點。這是將交換后的新“頭”節點連接到前面的鏈表上。
      • right.next = right.next.next;:接著,將 rightnext 指針指向它原來下一個節點的下一個節點,即跳過中間的節點。
      • left.next.next = right;:最后,將原來 right.nextnext 指針指向 right,完成兩個節點的交換。
    • 指針前移
      • left = right;:完成一對交換后,right 節點現在是這一對中的第二個(在后面)。我們需要為下一輪交換做準備,所以將 left 指針移動到 right 的位置。
      • right = left.next;:將 right 指針移動到下一對節點的第一個節點。
  3. 返回結果

    • 循環結束后,所有節點對都已交換完畢。dummy.next 指向了交換后鏈表的真正頭節點,將其返回。

完整代碼

/*** Definition for singly-linked list.*/
class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}class Solution {/*** 兩兩交換鏈表中的節點。* @param head 原始鏈表的頭節點* @return 交換后鏈表的頭節點*/public ListNode swapPairs(ListNode head) {// 創建一個哨兵節點,簡化頭節點交換的邏輯。ListNode dummy = new ListNode(0, head);// left 指針指向待交換對的前一個節點。ListNode left = dummy;// right 指針指向待交換對的第一個節點。ListNode right = head;// 循環條件:確保至少還有一對完整的節點可以交換。while (null != right && null != right.next) {// 核心交換邏輯,可以想象為三步指針重定向:// 假設原始是: left -> n1 -> n2 -> ...// 其中 n1 是 right, n2 是 right.next// 1. left 的 next 指向 n2left.next = right.next;// 2. n1 的 next 指向 n2 原來的 nextright.next = right.next.next;// 3. n2 的 next 指向 n1left.next.next = right;// 交換后,鏈表變為: left -> n2 -> n1 -> ...// 為下一輪交換做準備,移動指針:// left 移動到 n1 的位置left = right;// right 移動到 n1 的下一個位置,即下一對的第一個節點right = left.next;}// 返回哨兵節點的下一個節點,即新鏈表的頭。return dummy.next;}
}

時空復雜度

時間復雜度:O(N)

  1. 循環次數while 循環遍歷整個鏈表。right 指針每次前進兩步(邏輯上)。整個鏈表被掃描了一次。
  2. 每次操作:在循環的每一次迭代中,執行的都是常數次(固定次數)的指針賦值操作。

綜合分析
算法的時間復雜度與鏈表的長度 N 成線性關系。因此,時間復雜度為 O(N)

空間復雜度:O(1)

  1. 主要存儲開銷:算法只創建了 dummy, left, right 等幾個額外的指針變量。
  2. 空間大小:這些變量的數量是固定的,與輸入鏈表的長度 N 無關。

綜合分析
算法沒有使用任何與輸入規模成比例的額外數據結構。因此,其額外輔助空間復雜度為 O(1)。這是一個高效的原地算法。

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

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

相關文章

微積分核心考點全解析

一、微積分核心知識框架 1. 極限與連續(重點!) 核心概念: 極限定義(ε-δ語言)重要極限:lim?x→0sin?xx1limx→0?xsinx?1,lim?x→∞(11x)xelimx→∞?(1x1?)xe連續性判定&am…

TypeScript---泛型

一.簡介TypeScript 就引入了“泛型”(generics)。泛型的特點就是帶有“類型參數”(type parameter)。在日常 TypeScript 編程中,我們經常會遇到這樣的場景:函數的參數類型與返回值類型密切相關。此時&#…

手把手一起使用Miniforge3+mamba平替Anaconda(Win10)

Anaconda 開始對企業收費,目前急需平替Anaconda。這里采用Minforgemamba作為替代,可以避免Anaconda追責,并100%兼容原conda倉庫及使用方式,如果各位小伙伴有更好的平替方式,歡迎分享。 Miniforge3安裝 下載并安裝Min…

【Note】Linux Kernel 主題學習之“完整的嵌入式 Linux 環境、構建工具、編譯工具鏈、CPU 架構”

Linux Kernel 主題學習之“完整的嵌入式 Linux 環境、構建工具、編譯工具鏈、CPU 架構” 一、完整的嵌入式 Linux 環境 一個嵌入式 Linux 系統通常包括以下關鍵組件(以 Jetson、樹莓派等 ARM 版 SBC 為例): 交叉編譯工具鏈(cros…

Lecture #20:Database Logging

Lecture20目錄:崩潰恢復緩沖池管理策略竊取策略強制策略NO-STEAL-FORCE影子分頁執行恢復缺點日志文件預寫日志(WAL)執行緩沖池策略日志方案檢查點崩潰恢復 恢復算法是一種確保數據庫ACID的技術,數據庫崩潰后, 所有已經…

Kubernetes高級調度1

目錄 一:初始化容器 Initcontainer 1:Initcontainer 的基本概念 2:示例 1--延遲指定時間后啟動 3:示例 2--使用初始化容器修改內核參數 4:示例 3--等待依賴服務啟動 4:pause容器 二:臨時容器 Ephemeral Containers 1.臨時容器的概念 2.臨時容器的使用 三&a…

服務器機柜與網絡機柜各自的優勢

一、服務器機柜優勢服務器機柜設計有強大的承重結構,能承受大量服務器設備堆疊產生的重量,保障設備安全穩定放置,防止因承重不足導致機柜變形甚至設備損壞,同時,服務器在運行的過程中,會產生大量熱量&#…

AI技術通過提示詞工程(Prompt Engineering)正在深度重塑職場生態和行業格局,這種變革不僅體現在效率提升,更在重構人機協作模式。

AI技術通過提示詞工程(Prompt Engineering)正在深度重塑職場生態和行業格局,這種變革不僅體現在效率提升,更在重構人機協作模式。以下是關鍵影響維度及未來趨勢分析:一、職場效率革命(效率提升300%場景&…

Hugging Face 開源機器人 Reachy Mini 開啟預定

我們最新的開源機器人 Reachy Mini 正式亮相 🎉 這款富有表現力的開源機器人由 Pollen Robotics 與 Hugging Face 聯合打造,專為人機交互、創意編程和 AI 實驗而設計。它價格親民,體積小巧,卻蘊藏著無限可能。來自全球的各個年齡段…

vue3+node.js+mysql寫接口(二)

目錄 一、產品模塊(products表) 1.1、添加產品(/adminapi/product/add) 1.2、產品列表(/adminapi/product/list) 1.3、編輯產品(/adminapi/product/update) 1.4、首頁產品聯動 二、前臺模塊 2.1、路由配置 2.2、NavBar組件 2.3、新聞搜索 2.4、新聞選項卡 2.5、新聞…

解析LLM層裁剪:Qwen實戰指南

怎么實現對LLM 部分層裁剪輸出結果 Qwen 7b 是28層MLP,28頭 Qwen 14b 是48層MLP,40頭,詞向量維度:5120 模型加載部分 from transformers import AutoTokenizer, AutoModelForCausalLM

【AI大模型】深度學習正則化技術:Batch Normalization (BatchNorm) 詳解

1. 為什么需要 BatchNorm? - 問題的根源:Internal Covariate Shift (ICS)問題描述: 深度神經網絡在訓練過程中,隨著網絡層數的加深,前面層參數的微小更新會導致后面層輸入數據的分布發生顯著變化。這種現象稱為內部協變…

20.緩存問題與解決方案詳解教程

文章目錄1. 緩存基礎概念1.1 什么是緩存1.2 緩存的作用1.3 常見的緩存類型1.4 緩存架構示例2. 緩存雪崩 (Cache Avalanche)2.1 什么是緩存雪崩2.2 緩存雪崩的原因2.3 緩存雪崩的危害2.4 緩存雪崩的解決方案方案1:設置隨機過期時間方案2:緩存集群和主從復…

(滿滿的坑LLAMA3使用申請被拒絕rejected)利用huggingface導入LLAMA3模型

文章目錄前言坑后續前言 大家都知道,使用huggingface導入大模型是使用如下辦法 from transformers import AutoModelForCausalLM, AutoTokenizermodel_name "Qwen/Qwen2.5-7B-Instruct"#要導入的大模型名稱。model AutoModelForCausalLM.from_pretrai…

大規模集群下 Prometheus 監控架構實戰經驗分享

大規模集群下 Prometheus 監控架構實戰經驗分享 1 業務場景描述 在互聯網金融業務發展過程中,我們需要對數千臺主機、上萬容器與微服務實例進行指標監控,并統計歷史數據以支持 SLA 報表、告警與容量規劃。傳統監控系統面臨以下挑戰: 實例動態…

主流消息隊列技術總結和對比

消息隊列(Message Queue,簡稱 MQ)作為構建分布式互聯網應用的關鍵組件,松耦合的架構設計能顯著提升系統的可用性與可擴展性。在分布式系統中扮演著至關重要的角色,主要承擔著實現異步消息傳遞、應用解耦、流量削峰以及…

數據結構 順序表(3)---順序表的應用

在之間的兩篇文章中,我們著重講了順序表及順序表的實現。今天這篇文章我們將簡單講解關于順序表的三個算法題。這三個題也都屬于力扣上的經典例題。1.例題1:移除元素例題來源(力扣) : https://leetcode.cn/problems/remove-element/description/這是一道數組操作算法…

逆向入門(9)匯編篇-bound指令的學習

看程序的時候碰到這么一行沒見過的代碼,簡單記錄一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]這里是用到了bound指令,這是 x86 匯編中的指令,用于檢查數組索引是否在有效范圍內。 指令解析 bound edx, qword ptr ds…

【web應用】若依框架中,使用Echarts導出報表為PDF文件

文章目錄前言一、Echarts準備工作1、查看是否安裝了Echarts2、Echarts導入script 中3、使用Echarts創建圖表二、報表制作打印html2canvas和jsPDF準備工作1、安裝html2canvas和jsPDF依賴包2、html2canvas和jsPDF引用到script中3、制作并打印報表三、導出結果前言 若依框架前端中…

優選算法 --(雙指針算法 1~8)

引言:此專欄為記錄算法學習,本專題作為算法學習的第一部分,優選算法專題共計100題,分為不同小模塊進行,算法學習需堅持積累,時代不會辜負長期主義者,僅以此句,與君共勉。 講解算法分…