LeetCode Hot100刷題——反轉鏈表(迭代+遞歸)

206.反轉鏈表

給你單鏈表的頭節點?head?,請你反轉鏈表,并返回反轉后的鏈表。

示例 1:

輸入:head = [1,2,3,4,5]
輸出:[5,4,3,2,1]

示例 2:

輸入:head = [1,2]
輸出:[2,1]

示例 3:

輸入:head = []
輸出:[]

提示:

  • 鏈表中節點的數目范圍是?[0, 5000]
  • -5000 <= Node.val <= 5000

反轉鏈表通常有兩種方法:迭代法和遞歸法。

迭代法(雙指針)

????????假設原來的鏈表是1->2->3->4->5->null,反轉后變成null<-1<-2<-3<-4<-5。那在迭代的時候,初始狀態應該是prev=null,current=head。然后循環處理每個節點:????????????????????????

????????在循環中,首先保存當前節點的下一個節點nextTemp,然后把當前節點的next指向prev。接著prev移動到current的位置,current移動到nextTemp的位置。直到current為null,此時prev就是新的頭節點。

實現代碼:

/*** Definition for singly-linked list.* public 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 {public ListNode reverseList(ListNode head) {ListNode current = head;ListNode prev = null;while (current != null) {ListNode nextTemp = current.next; // 保存下一個節點current.next = prev; /// 反轉指針prev = current; // 前移prevcurrent = nextTemp; // 前移current}return prev; // prev即為新鏈表的頭結點}
}

步驟解釋:

  1. 初始化指針:使用兩個指針prevcurrent,初始時prevnullcurrent指向頭節點head

  2. 遍歷鏈表:在current不為null時循環處理每個節點。

    • 保存下一個節點:臨時存儲current.nextnextTemp,防止反轉指針后丟失后續節點。

    • 反轉指針:將當前節點currentnext指向prev,完成當前節點的反轉。

    • 移動指針:將prev移動到當前current的位置,current移動到之前保存的nextTemp位置。

  3. 返回新頭節點:當循環結束時,currentnullprev指向原鏈表的最后一個節點,即反轉后的新頭節點。

遞歸法

遞歸方法的步驟如下:

  1. 遞歸終止條件:當前節點為空或下一個子節點為空,返回當前節點
  2. 遞歸反轉后續鏈表,得到反轉后的頭結點
  3. 將當前節點的下一個節點的next指向當前節點,形成反轉
  4. 將當前節點的next設為null,斷開原來的連接
  5. 返回反轉后的頭結點

實現代碼

class Solution {public ListNode reverseList(ListNode head) {// 遞歸法// 遞歸終止條件,空鏈表或單鏈表無需反轉if (head == null || head.next == null) {return head;}// 遞歸反轉后續鏈表,得到新頭結點ListNode newHead = reverseList(head.next);// 調整指針方向,將當前節點的下一個節點的next指向自己head.next.next = head;// 斷開當前節點的原指向,防止循環head.next = null;// 返回新頭結點return newHead;}
}

示例分析

1. 遞歸調用棧展開

遞歸從頭部節點?1?開始,逐層深入,直到鏈表末尾的節點?5。以下是調用棧的展開過程:

reverseList(1) → reverseList(2) → reverseList(3) → reverseList(4) → reverseList(5)

終止條件觸發:當調用?reverseList(5)?時,5.next == null,直接返回?5(此時?newHead = 5)。

2. 遞歸回溯與指針調整

遞歸開始逐層回溯,每層處理當前節點并調整指針方向:

層 4(head = 4

  • 輸入鏈表狀態4 → 5

  • 操作步驟

    1. 收到下層返回的?newHead = 5

    2. 調整指針4.next.next = 4?→?5.next = 4(形成?5 → 4)。

    3. 斷開原鏈4.next = null(防止?4 → 5?循環)。

  • 輸出鏈表狀態5 → 4 → null

  • 返回newHead = 5

層 3(head = 3

  • 輸入鏈表狀態3 → 4 → null(原鏈未修改時,3.next?仍指向?4)。

  • 操作步驟

    1. 收到下層返回的?newHead = 5

    2. 調整指針3.next.next = 3?→?4.next = 3(形成?5 → 4 → 3)。

    3. 斷開原鏈3.next = null

  • 輸出鏈表狀態5 → 4 → 3 → null

  • 返回newHead = 5

層 2(head = 2

  • 輸入鏈表狀態2 → 3 → null(原鏈未修改時,2.next?指向?3)。

  • 操作步驟

    1. 收到下層返回的?newHead = 5

    2. 調整指針2.next.next = 2?→?3.next = 2(形成?5 → 4 → 3 → 2)。

    3. 斷開原鏈2.next = null

  • 輸出鏈表狀態5 → 4 → 3 → 2 → null

  • 返回newHead = 5

層 1(head = 1

  • 輸入鏈表狀態1 → 2 → null(原鏈未修改時,1.next?指向?2)。

  • 操作步驟

    1. 收到下層返回的?newHead = 5

    2. 調整指針1.next.next = 1?→?2.next = 1(形成?5 → 4 → 3 → 2 → 1)。

    3. 斷開原鏈1.next = null

  • 輸出鏈表狀態5 → 4 → 3 → 2 → 1 → null

  • 返回newHead = 5

總結

  1. 遞歸終止條件:處理到鏈表末尾時直接返回。

  2. 遞歸分解問題:假設后續鏈表已反轉,只需調整當前節點和下一個節點的指針。

  3. 指針操作:通過?head.next.next = head?和?head.next = null?完成局部反轉并斷開原鏈。

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

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

相關文章

機器學習的發展史

機器學習&#xff08;Machine Learning, ML&#xff09;作為人工智能&#xff08;AI&#xff09;的一個分支&#xff0c;其發展經歷了多個階段。以下是機器學習的發展史概述&#xff1a; 1. 早期探索&#xff08;20世紀50年代 - 70年代&#xff09; 1950年&#xff1a;艾倫圖…

Springboot redis bitMap實現用戶簽到以及統計,保姆級教程

項目架構&#xff0c;這是作為demo展示使用&#xff1a; Redis config&#xff1a; package com.zy.config;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…

Ardupilot開源無人機之Geek SDK進展2025Q1

Ardupilot開源無人機之Geek SDK進展2025Q1 1. 源由2. 內容匯總2.1 【jetson-fpv】YOLO INT8 coco8 dataset 精度降級2.2 【OpenIPC-Configurator】OpenIPC Configurator 固件升級失敗2.3 【OpenIPC-Adaptive-link】OpenIPC RF信號質量相關顯示2.4 【OpenIPC-msposd】.srt/.osd…

《云原生監控體系構建實錄:從Prometheus到Grafana的觀測革命》

PrometheusGrafana部署配置 Prometheus安裝 下載Prometheus服務端 Download | PrometheusAn open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.https://prometheus.io/…

SpringMvc與Struts2

一、Spring MVC 1.1 概述 Spring MVC 是 Spring 框架的一部分&#xff0c;是一個基于 MVC 設計模式的輕量級 Web 框架。它提供了靈活的配置和強大的擴展能力&#xff0c;適合構建復雜的 Web 應用程序。 1.2 特點 輕量級&#xff1a;與 Spring 框架無縫集成&#xff0c;依賴…

數據類設計_圖片類設計之1_矩陣類設計(前端架構基礎)

前言 學的東西多了,要想辦法用出來.C和C是偏向底層的語言,直接與數據打交道.嘗試做一些和數據方面相關的內容 引入 圖形在底層是怎么表示的,用C來表示 認識圖片 圖片是個風景,動物,還是其他內容,人是可以看出來的.那么計算機是怎么看懂的呢?在有自主意識的人工智能被設計出來…

開發者社區測試報告(功能測試+性能測試)

功能測試 測試相關用例 開發者社區功能背景 在當今數字化時代&#xff0c;編程已經成為一項核心技能&#xff0c;越來越多的人開始學習編程&#xff0c;以適應快速變化的科技 環境。基于這一需求&#xff0c;我設計開發了一個類似博客的論壇系統&#xff0c;專注于方便程序員…

EasyRTC嵌入式音視頻通話SDK:基于ICE與STUN/TURN的實時音視頻通信解決方案

在當今數字化時代&#xff0c;實時音視頻通信技術已成為人們生活和工作中不可或缺的一部分。無論是家庭中的遠程看護、辦公場景中的遠程協作&#xff0c;還是工業領域的遠程巡檢和智能設備的互聯互通&#xff0c;高效、穩定的通信技術都是實現這些功能的核心。 EasyRTC嵌入式音…

【OneAPI】網頁截圖API-V2

API簡介 生成指定URL的網頁截圖或縮略圖。 舊版本請參考&#xff1a;網頁截圖 V2版本新增全屏截圖、帶殼截圖等功能&#xff0c;并修復了一些已知問題。 全屏截圖&#xff1a; 支持全屏截圖&#xff0c;通過設置fullscreentrue來支持全屏截圖。全屏模式下&#xff0c;系統…

簡單的 Python 示例,用于生成電影解說視頻的第一人稱獨白解說文案

以下是一個簡單的 Python 示例&#xff0c;用于生成電影解說視頻的第一人稱獨白解說文案。這個示例使用了 OpenAI 的 GPT 模型&#xff0c;因為它在自然語言生成方面表現出色。 實現思路 安裝必要的庫&#xff1a;使用 openai 庫與 OpenAI API 進行交互。設置 API 密鑰&#…

記錄小白使用 Cursor 開發第一個微信小程序(一):注冊賬號及下載工具(250308)

文章目錄 記錄小白使用 Cursor 開發第一個微信小程序&#xff08;一&#xff09;&#xff1a;注冊賬號及下載工具&#xff08;250308&#xff09;一、微信小程序注冊摘要1.1 注冊流程要點 二、小程序發布流程三、下載工具 記錄小白使用 Cursor 開發第一個微信小程序&#xff08…

六軸傳感器ICM-20608

ICM-20608-G是一個6軸傳感器芯片&#xff0c;由3軸陀螺儀和3軸加速度計組成。陀螺儀可編程的滿量程有&#xff1a;250&#xff0c;500&#xff0c;1000和2000度/秒。加速度計可編程的滿量程有&#xff1a;2g&#xff0c;4g&#xff0c;8g和16g。學習Linux之SPI之前&#xff0c;…

python可應用在金融分析的那一個方面,如何部署在linux server上面。

Python 在金融分析中應用廣泛&#xff0c;以下是幾個主要方面&#xff1a; ### 1. **數據處理與分析** - 使用 **Pandas** 和 **NumPy** 等庫來處理和分析大規模數據集&#xff0c;進行清理、轉換和統計運算。 - 舉例&#xff1a;處理歷史市場數據&#xff0c;分析價格趨…

Git與GitHub:理解兩者差異及其關系

目錄 Git與GitHub&#xff1a;理解兩者差異及其關系Git&#xff1a;分布式版本控制系統概述主要特點 GitHub&#xff1a;基于Web的托管服務概述主要特點 Git和GitHub如何互補關系現代開發工作流 結論 Git與GitHub&#xff1a;理解兩者差異及其關系 Git&#xff1a;分布式版本控…

STM32全系大閱兵(1)

本文內容參考: STM32家族系列的區別_stm32各個系列區別-CSDN博客 STM32--STM32 微控制器詳解-CSDN博客

clickhouse刪除一條數據

在當今數據驅動的世界中&#xff0c;ClickHouse作為一種高性能的列式數據庫管理系統&#xff0c;廣泛應用于需要快速分析大量數據的場景。也許對于初學者來說&#xff0c;掌握如何有效地管理數據&#xff0c;包括添加、更新和刪除數據&#xff0c;是使用ClickHouse進行數據分析…

std::vector的模擬實現

目錄 構造函數 無參構造 用n個val來初始化的拷貝構造 拷貝構造 用迭代器初始化 析構函數 reserve resize pushback pop_back 迭代器及解引用 迭代器的實現 解引用[ ] insert erase 賦值拷貝 補充 vector底層也是順序表&#xff0c;但是vector可以儲存不同的類…

藍橋杯刷題周計劃(第二周)

目錄 前言題目一題目代碼題解分析 題目二題目代碼題解分析 題目三題目代碼題解分析 題目四題目代碼題解分析 題目五題目代碼題解分析 題目六題目代碼題解分析 題目七題目代碼題解分析 題目八題目題解分析 題目九題目代碼題解分析 題目十題目代碼題解分析 題目十一題目代碼題解分…

clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式開發

0.前言 正文可以跳過這段 初識clion&#xff0c;應該是2015年首次發布的時候&#xff0c; 那會還是大三&#xff0c;被一則推介廣告吸引到&#xff0c;當時還在用vs studio&#xff0c;但是就喜歡鼓搗新工具&#xff0c;然后下載安裝試用了clion&#xff0c;但是當時對cmake規…

藍橋杯備考:離散化詳解

首先&#xff0c;為什么要有離散化呢&#xff1f; 比如這道題&#xff0c;我們應該開一個差分數組&#xff0c;但是a&#xff0c;b之間的間隔可是太大了&#xff0c;難道我們要開一個2的三十二次方大小的數組嗎&#xff1f;我們也是開不了這么大的數組的 我們就需要把這些數離…