LeetCode刷題:反轉鏈表

leetCode真題

206. 反轉鏈表

屬于基礎簡單題目

常見的做法有遞歸和while循環
在這里插入圖片描述

遞歸

    // 1. 遞歸參數和返回值public static ListNode reverseList(ListNode head) {// 1. 遞歸終止條件if (head == null || head.next == null) {return head;}// 遞歸邏輯ListNode last = reverseList(head.next);// last是未反轉鏈表的最后一個節點head.next.next = head;// head和last構成雙向head.next = null;// head的向last的指向取消return last;}

不要用自己的大腦想象遞歸過程,人的大腦記不住幾個棧!

這段代碼我們要分析其中的實現邏輯

  1. 我們要反轉整個鏈表(head節點),就要先反轉鏈表的子鏈表(head.next),然后將head修改到整個鏈表的第一個位置(head.next.next = head;head.next = null;)

  2. 而要反轉子鏈表head.next,就需要反轉head.next的子鏈表,也就是head.next.next

  3. ……直到head.next為null時,此時整個子鏈表只有一個節點(節點5),單獨的一個節點顯然已經完成了反轉,此時直接return返回,return返回之后,head指向4節點,last指向5節點在這里插入圖片描述在這里插入圖片描述

  4. 然后是反轉倒數第二個節點(4),4節點的子鏈表顯然已經完成了反轉,此時只要將4節點拼接到5節點之后即可完成4,5節點的反轉
    head.next.next = head;
    在這里插入圖片描述

head.next = null;
在這里插入圖片描述

return last;
在這里插入圖片描述

  1. head指向3節點,重復第四步,直到最后整個鏈表完成反轉

測試demo

ListNode類

public class ListNode {public int val;public ListNode next;public ListNode() {}public ListNode(int val) {this.val = val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}public void loop(ListNode head) {while (head != null) {System.out.print(head.val + "  ");head = head.next;}}
}

反轉實現

public class ListTest {public static void main(String[] args) {ListNode _5 = new ListNode(5);ListNode _4 = new ListNode(4, _5);ListNode _3 = new ListNode(3, _4);ListNode _2 = new ListNode(2, _3);ListNode head = new ListNode(1, _2);System.out.print("====反轉前:");head.loop(head);System.out.println();head = reverseList1(head);System.out.print("====反轉后:");head.loop(head);System.out.println();}// 1. 遞歸參數和返回值public static ListNode reverseList1(ListNode head) {// 1. 遞歸終止條件if (head == null || head.next == null) {return head;}// 遞歸邏輯ListNode last = reverseList1(head.next);// last是未反轉鏈表的最后一個節點head.next.next = head;// head和last構成雙向head.next = null;// head的向last的指向取消return last;}
}

在這里插入圖片描述

while循環

使用遞歸的好處是,代碼簡潔,但是當鏈表數量特別大的時候,遞歸可能會引起java的虛擬機棧棧溢出

我們提出了第二種方法,就是while循環

	public static ListNode reverseList2(ListNode head) {// head節點拷貝,pre和later節點用于暫存cur節點的前節點和后節點ListNode pre = null, cur = head, later = null;while (cur != null) {// cur節點代表了要反轉的節點,cur節點為null說明所有節點反轉完畢later = cur.next;// 1. later節點指向下一節點cur.next = pre;// 2. cur節點的next節點指向pre節點pre = cur;// 3. pre節點指向cur節點cur = later;// 4. cur節點指向later節點}return pre;}
  1. ListNode pre = null, cur = head, temp;
    head節點拷貝,pre和later節點用于后續暫存cur節點的前節點和后節點

  2. while (cur != null) {}

cur節點代表了要反轉的節點,cur節點為null說明所有節點反轉完畢
在這里插入圖片描述

  1. later = cur.next;
    記錄cur節點的后節點later

在這里插入圖片描述

  1. cur.next = pre;(最核心的一步)

有人此時會說了,pre不是null嗎,為什么不能直接cur.next = null;呢?

這行代碼的真正含義是新增一條反向的路徑,只是第一個節點反轉的時候pre恰好為null

在這里插入圖片描述

  1. pre = cur;
    記錄要反轉的節點的上一個節點
    在這里插入圖片描述

  2. cur = temp;
    相當于cur = cur.next,cur節點遍歷到下一個節點位置

在這里插入圖片描述

  1. 重復上述6步
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    在這里插入圖片描述
    反轉節點3
    在這里插入圖片描述

測試demo

同上

總結

遞歸的代碼邏輯清晰,但是消耗內存會比較多,而且可能會棧溢出;
while循環不會棧溢出;

兩者的時間復雜度都是O(n)級別的

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

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

相關文章

達夢數據庫相關SQL及適配Mysql配置總結

🍓 簡介:java系列技術分享(👉持續更新中…🔥) 🍓 初衷:一起學習、一起進步、堅持不懈 🍓 如果文章內容有誤與您的想法不一致,歡迎大家在評論區指正🙏 🍓 希望這篇文章對你有所幫助,歡…

解決Python導入第三方模塊報錯“TypeError: the first argument must be callable”

注意以下內容只對導包時遇到同樣的報錯會有參考價值。 問題描述 當你嘗試導入第三方模塊時,可能會遇到如下報錯信息: TypeError: the first argument must be callable 猜測原因 經過仔細檢查代碼,我猜測這個錯誤的原因是由于變量名沖突所…

Windows 系統安裝 VisualSVN Server

一.下載 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服務器端要使用的軟件,就是我們提交代碼存在安裝這個軟件的電腦上,它將很多配置和服務直接幫你完成,簡單好用容易上手。VisualSVN Server有三個版本,社區版免費但限15個用戶,另有一般和‘企業’兩個收費版本…

如何卸載ollama

文章目錄 一 概述二 卸載2.1 Windows平臺卸載 ollama2.2 Linux 平臺卸載 ollama2.3 Docker 平臺卸載 ollama 參考鏈接 一 概述 本文檔主要講述 ollama 如何卸載,適用范圍包括 Windows Linux 以及 Docker 等平臺的安裝方式。 二 卸載 2.1 Windows平臺卸載 ollama …

學習C++應該做點什么項目

C作為一門底層可操作性很強的語言,廣泛應用于游戲開發、工業和追求性能、速度的應用。 比如騰訊,無論游戲,還是微信,整個鵝廠后臺幾乎都是 C 開發,對 C 開發者的需求非常大。 但問題是C入門和精通都比較困難&#xf…

有哪些掙錢軟件一天能賺幾十元?盤點十個能長期做下去的掙錢軟件

在這個信息爆炸的時代,每個人都在尋找快速賺錢的秘訣。很多人做兼職副業的目標并不是獲得很大的成功,大部分人一天能賺幾十就心滿意足了。 今天,我要帶你一探究竟,揭秘那些能讓你日賺幾十元的掙錢軟件。準備好了嗎?讓我…

單槍匹馬月入17萬美元:數字游民Pieter Levels如何成就商業傳奇

了解數字游民的應該都聽說過 Pieter Levels,可以說他是數字游民的先驅人物。 他在推特上擁有超過43萬的粉絲,僅憑一臺筆記本電腦就連續建立了多個高盈利網站,光是推特主頁上展示的比較新的幾個網站,每月收入加起來就高達 17.6 萬…

第九周:員工激勵理論

1. 關注自己到關注他人 你是激勵者,也會是被激勵者。 雖然每個人的價值觀不一樣,但要做好激勵員工這件事情,我覺得可以從自身角度出發,可以問問自己,你是如何被激勵的? 如果是我,就只想要錢&…

如何實現區域公司和專業公司合理有效的銜接?

對于集團公司來說,各區域公司、專業公司的管理問題成為困擾管理者的難題。特別是在信息壁壘比較嚴重的情況下,各個單位往往各自為政、自行其是,缺乏有效的溝通和協作,導致整體管理效率低下。那么應該如何實現區域公司和專業公司合…

Vulnhub項目:THE PLANETS: MERCURY

1、靶場地址 The Planets: Mercury ~ VulnHubThe Planets: Mercury, made by SirFlash. Download & walkthrough links are available.https://vulnhub.com/entry/the-planets-mercury,544/ 這好像是個系列的,關于星球系列,之前還做過一個地球的&a…

滑動窗口最大值-力扣

在做這道題時,首先想到的解法是使用隊列來做,維護一個隊列,每次保存滑動窗口大小的長度,并判斷此時隊列中的最大值,但這樣做,在k的值較大時,出現了超時問題,代碼如下: c…

STM32-15-DMA

STM32-01-認識單片機 STM32-02-基礎知識 STM32-03-HAL庫 STM32-04-時鐘樹 STM32-05-SYSTEM文件夾 STM32-06-GPIO STM32-07-外部中斷 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定時器 STM32-11-電容觸摸按鍵 STM32-12-OLED模塊 STM32-13-MPU STM32-14-FSMC_LCD 文章目錄 STM…

[原創][Delphi多線程]TThreadedQueue的經典使用案例.

[簡介] 常用網名: 豬頭三 出生日期: 1981.XX.XX QQ: 643439947 個人網站: 80x86匯編小站 https://www.x86asm.org 編程生涯: 2001年~至今[共22年] 職業生涯: 20年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delph…

悉數六大設計原則

悉數六大設計原則 目錄 悉數六大設計原則前言?誰發明了設計模式設計原則設計原則與設計模式的關系 單一職責什么是單一職責不遵循單一職責原則的設計遵循單一職責原則的設計單一職責的優點示例代碼: 里氏替換原則什么是里氏替換原則示例代碼:違反里氏替…

解讀信創產業根基,操作系統發展歷程

信創產業根基之一操作系統 操作系統是一個關鍵的控制程序,負責協調、管理和控制計算機硬件和軟件資源。作為硬件的首要軟件擴展,它位于裸機與用戶之間,充當了兩者之間的橋梁。通過其核心程序,操作系統高效地管理著系統中的各類資源…

static修飾變量和函數

static修飾的變量和函數只能在定義它的cpp源文件中使用,如果在頭文件中定義,則需要注意 在頭文件中定義static變量和static函數: 變量 如果在頭文件中定義了static變量,那么,所有包含這個頭文件的源文件都會定義自己…

vm-bhyve虛擬機安裝ubuntu22版本后進入grub無法啟動

問題:安裝ubuntu22版本后無法啟動 安裝好ubuntu22之后,重啟進入了grub模式,沒有自動啟動ubuntu 網上查了一下,這算一個通病。 問題解決 在grub模式下輸入boot命令: boot (lvm/ubuntu--vg-ubuntu--lv)/boot error: …

有哪些兼職軟件一天能賺幾十元?盤點十個能長期做下去的掙錢軟件

在當今這個信息泛濫的時代,眾人紛紛尋求迅速致富的捷徑。許多人在從事兼職或副業時,并不期望取得巨大的成就,只要每天能額外收入數十元,便已心滿意足。 今天,我將帶領大家深入探究,揭開那些隱藏在日常生活…

【小海實習日記】Git使用規范

1.Git使用流程 1.1 從master分支拉一個分支,命名要符合規范且清晰。 1.2 commit到本地,push 到遠端。 1.3 在Gitlab創建MR,選擇develp分支。 1.4 如果要修改的話,先把Gitlab上的MR修改為Draft(修改態),然后在本地修改代…

Dubbo中的Invoker與Exporter機制詳解

Dubbo作為一款成熟的高性能、輕量級的Java RPC框架,其核心機制之一便是Invoker與Exporter機制,它們在服務提供端和服務消費端扮演著至關重要的角色,是實現服務調用和管理的基礎。下面將詳細解析這兩個核心組件的工作原理及其在Dubbo框架中的作…