【算法--鏈表】25.K個一組翻轉鏈表--通俗講解

一、題目是啥?一句話說清

給你一個鏈表,每k個節點一組進行反轉,如果最后剩余的節點不足k個,則保持原狀。需要實際交換節點,而不僅僅是改變值。

示例:

  • 輸入:head = [1,2,3,4,5], k = 2
  • 輸出:[2,1,4,3,5](因為每2個一組反轉,最后剩余5不足2個,保持原狀)

二、解題核心

使用虛擬頭節點簡化操作,然后遍歷鏈表,每次檢查是否有k個節點,如果有則反轉這k個節點,并正確連接反轉后的組與前后部分。 這就像處理一列火車車廂,每k節車廂為一組進行調頭,調頭后還要重新連接好前后車廂。

三、關鍵在哪里?(3個核心點)

想理解并解決這道題,必須抓住以下三個關鍵點:

1. 虛擬頭節點(Dummy Node)的使用

  • 是什么:在原始鏈表前添加一個不存儲實際數據的節點。
  • 為什么重要:反轉后頭節點可能改變(例如原來頭節點是1,反轉后可能變成2),使用虛擬頭節點可以避免單獨處理頭節點變化的特殊情況。

2. 分組檢查與反轉

  • 是什么:每次反轉前,先檢查是否還有k個節點可供反轉。如果不足k個,則保持剩余節點原狀。
  • 為什么重要:這確保了算法只反轉完整的k個節點組,并正確處理剩余節點。

3. 連接反轉后的組

  • 是什么:反轉一組節點后,需要將前一組節點的尾部與反轉后的新頭部連接,并將反轉后的新尾部與下一組節點的頭部連接。
  • 為什么重要:如果連接不正確,鏈表會斷開或形成環,導致錯誤。

四、看圖理解流程(通俗理解版本)

讓我們用鏈表 1 → 2 → 3 → 4 → 5 和 k=2 的例子來可視化過程:

  1. 初始化

    • 創建虛擬頭節點 dummy,其 next 指向頭節點 1。
    • 設置 pointer 指針指向 dummy,用于記錄當前組的前一個節點。
    • 初始狀態:dummy → 1 → 2 → 3 → 4 → 5
  2. 第一組反轉(反轉1和2)

    • 檢查是否有2個節點:從pointer開始,有2個節點(1和2)。
    • 反轉1和2:
      • 初始化:prev = null, curr = 1, next = null
      • 第一步:next = 2, curr.next = null, prev = 1, curr = 2
      • 第二步:next = 3, curr.next = 1, prev = 2, curr = 3
    • 反轉后:2 → 1
    • 連接:pointer.next(dummy)指向2(新頭),1(新尾)指向3(下一組的頭)。
    • 更新 pointer 指向1(新尾)。
    • 當前鏈表:dummy → 2 → 1 → 3 → 4 → 5
  3. 第二組反轉(反轉3和4)

    • 檢查是否有2個節點:從pointer(1)開始,有2個節點(3和4)。
    • 反轉3和4:
      • 初始化:prev = null, curr = 3, next = null
      • 第一步:next = 4, curr.next = null, prev = 3, curr = 4
      • 第二步:next = 5, curr.next = 3, prev = 4, curr = 5
    • 反轉后:4 → 3
    • 連接:pointer.next(1)指向4(新頭),3(新尾)指向5(下一組的頭)。
    • 更新 pointer 指向3(新尾)。
    • 當前鏈表:dummy → 2 → 1 → 4 → 3 → 5
  4. 第三組檢查

    • 檢查是否有2個節點:從pointer(3)開始,只有1個節點(5),不足2個,因此保持原狀。
    • 結束循環。
  5. 返回結果:返回 dummy.next,即新頭節點2。

五、C++ 代碼實現(附詳細注釋)

#include <iostream>
using namespace std;// 鏈表節點定義
struct ListNode {<

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

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

相關文章

Git指令 | 個人學習筆記

主要包含git的日常核心操作。 1.創建新倉庫 創建新文件夾&#xff0c;打開&#xff0c;然后執行。 git init2.創建一個本地倉庫的克隆版本 先cd到指定的目錄下&#xff0c;再 git clone /path/to/respository # 指定遠程分支 git clone -b <分支名> <倉庫地址> …

Apache 的安裝及基本使用

1 Apache 簡介Apache HTTP Server&#xff08;通常簡稱 “Apache”&#xff09;是世界上最流行、歷史最悠久的開源 Web 服務器軟件之一&#xff0c;由 Apache 軟件基金會&#xff08;Apache Software Foundation&#xff09;維護。它的核心功能是接收客戶端&#xff08;如瀏覽器…

五大主流大語言模型(LLM)對比

文章目錄&#x1f916; 五大主流大型語言模型&#xff08;LLM&#xff09;對比1. ChatGPT (GPT-5) - OpenAI2. Claude 4 (Sonnet & Opus) - Anthropic3. Gemini 2.5 Pro - Google DeepMind4. Grok 4 - xAI5. DeepSeek R1 - 深度求索五款模型的綜合對比表&#x1f680; 該如…

redo log詳解

在 MySQL 中&#xff0c;Redo Log&#xff08;重做日志&#xff09; 是 InnoDB 存儲引擎實現事務持久性&#xff08;ACID 中的 D&#xff09; 的核心機制&#xff0c;同時也通過 “預寫日志&#xff08;Write-Ahead Logging, WAL&#xff09;” 策略提升了數據寫入性能。它記錄…

Linux awk命令完全指南:從原理到實戰,搞定文本處理難題

在Linux世界里&#xff0c;文本處理是運維、開發繞不開的日常——從分析日志、提取配置信息到統計數據&#xff0c;都需要高效的工具支撐。而awk&#xff0c;作為一款強大的文本分析語言&#xff0c;憑借“按字段處理”的核心能力&#xff0c;成為了比grep&#xff08;單純匹配…

畢業項目推薦:68-基于yolov8/yolov5/yolo11的水稻蟲害檢測識別系統(Python+卷積神經網絡)

文章目錄 項目介紹大全&#xff08;可點擊查看&#xff0c;不定時更新中&#xff09;概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式…

Qt為什么要引入QML語言?

Qt發布于1991年&#xff0c;經過30多年的發展&#xff0c;Qt/C已經成為了眾多學子&#xff0c;拿來學習C的首選框架。Qt/Widgets&#xff0c;相對于其他界面庫&#xff08;如GNOME、KDE&#xff09;&#xff0c;其實已經很優秀&#xff0c;已經可以成為number one了。在已經是第…

設計模式在Java中的應用:從單例模式到工廠模式的全面解析!

全文目錄&#xff1a;開篇語前言1. 單例模式&#xff1a;確保全局只有一個實例1.1 餓漢式單例1.2 懶漢式單例1.3 雙重檢查鎖定&#xff08;DCL&#xff09;2. 工廠模式&#xff1a;簡化對象創建2.1 簡單工廠模式2.2 工廠方法模式2.3 抽象工廠模式3. 其他設計模式3.1 觀察者模式…

Meta AIUCSD放大招:DeepConf 讓大語言模型推理既快又準,84.7%的token節省+近乎完美的準確率!

1. 【前言】 Meta&UCSD 大語言模型&#xff08;LLMs&#xff09; 在推理任務中通過自一致性等測試時縮放方法展現出巨大潛力&#xff0c;但存在精度收益遞減和計算開銷高的問題。為此&#xff0c;Meta與UCSD的研究人員提出DeepConf方法&#xff0c;它利用模型內部的置信度信…

解決leetcode第3671.子序列美麗值求和問題

3671. 子序列美麗值求和難度&#xff1a;困難問題描述&#xff1a;給你一個長度為 n 的整數數組 nums。對于每個 正整數 g&#xff0c;定義 g 的 美麗值 為 g 與 nums 中符合要求的子序列數量的乘積&#xff0c;子序列需要 嚴格遞增 且最大公約數&#xff08;GCD&#xff09;恰…

電機控制(一)-電機分類

電機分類 電機分類&#xff1a; 電機的拓撲模型并沒有發生太大變化,變化較大的是控制電機的方法。 常見的電機類型有&#xff1a; 步進電機vs伺服電機 在工業自動化、機器人、精密設備等領域&#xff0c;步進電機和伺服電機是兩種最常用的驅動電機&#xff0c;但兩者的核心…

【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法 QToolBar 是 Qt 中用于創建工具欄的控件&#xff0c;可快速放置常用功能按鈕、分隔符或自定義控件&#xff0c;并支持拖動停靠、浮動等特性。 1. 基礎創建與添加到主窗口 // 在 QMainWindow 中創建工具欄 QToolBar *toolBar new QToolBar(tr("主工…

DVWA靶場通關筆記-驗證碼繞過Insecure CAPTCHA (Impossible級別)

目錄 一、reCAPTCHA 1、配置security為Impossible級別。 2、配置RECAPTCHA參數 3、再次打開靶場 二、源碼分析 1、index.php 2、impossible.php 3、功能函數 三、reCAPTCHA 防范分析 1、嚴格的參數驗證與處理 2、預處理防止SQL注入 3、CAPTCHA 驗證通過 4、驗證當前…

MySQL安裝(如果之前有安裝過MySQL,先執行下面的卸載流程)

1.安裝MySQL 1.1更新系統的軟件包列表 sudo apt-get update1.2安裝MySQL服務器 sudo apt-get install mysql-server1.3檢查MySQL服務是否啟動&#xff0c;若沒有啟動手動啟動若沒有啟動執行&#xff1a; sudo service mysql start1.4登錄MySQL&#xff08;默認安裝之后不需要密…

Streamlit 數據看板模板:非前端選手快速搭建 Python 數據可視化交互看板的實用工具

你想想看&#xff0c;平時你用 Python 跑出來一堆數據 —— 比如用戶留存率、產品銷量變化&#xff0c;想給領導或者同事看&#xff0c;總不能直接發個 CSV 文件或者一堆靜態圖吧&#xff1f;對方看的時候還得自己翻數據&#xff0c;想對比下上個月和這個月的變化都費勁&#x…

FMC、FMC+ 詳解

文章目錄FMC 簡介FMC 引腳輸出定義High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 簡介VITA57 標準更新歷史VITA57.4 標準推出的原因FMC 引腳輸出定義Altera 開發板的 FMC 引腳定義英特爾 Arria 10 GX FP…

小迪web自用筆記24

黑名單機制。如果被過濾可以試試PHP5看看過濾沒&#xff08;或者其他變種變形&#xff09;&#xff0c;但是得看環境有些環境會被當成下載&#xff0c;有些會直接打開。白名單機制只允許這幾個特定后綴可以上傳&#xff0c;比黑名單更安全。直接從信息圖中獲取文件類型。文件類…

私有部署問卷系統、考試系統、投票系統、測評系統的最佳選擇-調問開源問卷表單(DWSurvey)

在選擇私有部署問卷系統的時候&#xff0c;調問問卷系統(DWSurvey)是一定要嘗試一下&#xff0c;而且可以應用到私有部署考試系統、私有部署投票系統、私有部署測評系統等多個應用場景。 私有部署問卷、考試、測評、投票系統的優勢不言而喻&#xff0c;就拿私有部署考試系統來說…

企業實用——MySQL的備份詳解

序言: 本次基于mysql8.0.40來給大家做數據庫的備份的實用技巧和思路!對于mysql基礎的部分后續我會節選部分給大家講解,本篇文章適合有一定數據庫基礎的小伙伴看。 目錄 一、MySQL備份概述 1、關于數據保存你要知道 2、到底要備份什么 備份什么 MySQL體系結構(MySQL =…

使用 FunASR 工具包實現音頻文件的語音識別

使用 FunASR 工具包實現音頻文件的語音識別&#xff0c;并將識別結果保存為文本文件&#xff0c;支持單文件處理和批量處理。電腦環境需要配置&#xff0c;我使用的PyTorch版本: 2.4.1cu121&#xff0c;CUDA可用: True。FunASR 是一個功能強大、性能卓越、面向工業應用的語音識…