《 java 隨想錄》| LeetCode鏈表高頻考題

前言:這是專門針對java語言講解的算法解析(題目順序大致參考《代碼隨想錄》)

思維導圖

操作鏈表

刪除節點

鏈表-刪除節點

刪除鏈表中 D 節點時,只需將其前驅節點 C 的 next 指針指向 D 的下一個節點 E

添加節點

鏈表-添加節點?

先讓?新節點 F 的 next 指針?指向?C 原來的后繼節點 D(保存原有連接,避免鏈表斷裂);

再讓?C 節點的 next 指針?指向?新節點 F,完成插入。

鏈表基礎代碼

public class ListNode {// 結點的值int val;// 下一個結點ListNode next;// 節點的構造函數(無參)public ListNode() {}// 節點的構造函數(有一個參數)public ListNode(int val) {this.val = val;}// 節點的構造函數(有兩個參數)public ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}

LeetCode203. 移除鏈表元素

?


一、核心邏輯:通過虛擬頭節點統一移除邏輯

鏈表中每個節點包含值和指向下一節點的引用,要移除值為目標值的節點,可引入虛擬頭節點(不存儲實際數據),使其作為原頭節點的前驅。這樣無論是頭節點還是中間節點,都能通過 “前驅節點指針調整” 的方式統一處理,避免頭節點特殊處理的繁瑣。

二、關鍵細節:虛擬頭節點的使用與指針遍歷

移除鏈表元素的難點在于頭節點與其他節點處理邏輯不一致,而虛擬頭節點可消除這種差異。通過維護一個遍歷指針,始終指向當前待檢查節點的前驅,就能統一執行 “跳過目標節點” 的操作。

解法:虛擬頭節點 + 前驅指針遍歷

區間(邏輯范圍)含義:以虛擬頭節點為起點,遍歷指針?prev?始終指向當前處理節點的前驅,待檢查范圍是?prev.next?及之后的節點。
循環條件:while (prev.next != null)
因為只要?prev?的下一個節點存在,就需要檢查其是否為目標值,循環繼續。
指針調整:

  • 若?prev.next.val == val:說明下一個節點是目標節點,需移除,因此將?prev.next?指向?prev.next.next(跳過目標節點)。
  • 若?prev.next.val != val:說明下一個節點無需移除,prev?后移一位(prev = prev.next),繼續檢查后續節點。
    返回結果:循環結束后,所有目標節點已被移除,返回虛擬頭節點的下一個節點(即新的頭節點)

代碼示例:

public ListNode removeElements(ListNode head, int val) {while(head!=null && head.val==val) {head = head.next;}ListNode curr = head;while(curr!=null && curr.next !=null) {if(curr.next.val == val){curr.next = curr.next.next;} else {curr = curr.next;}}return head;
}

LeetCode206. 反轉鏈表


如果再定義一個新的鏈表,實現鏈表元素的反轉,其實這是對內存空間的浪費

其實只需改變鏈表的next指針的指向直接將鏈表反轉 ,而非重新定義一個新的鏈表,如圖:

206_反轉鏈表

我們拿有示例中的鏈表來舉例,如動畫所示

  • 初始化指針:cur 指向頭節點,pre 初始化為 null,tmp 用于臨時保存節點。
  • 當 cur 不為 null 時,執行以下操作:
  • 保存下一個節點:用 tmp 存儲 cur 的 next 節點(避免后續指向改變后丟失)。
  • 反轉當前節點指向:將 cur 的 next 指向 pre。
  • 移動指針:pre 移至 cur 位置,cur 移至 tmp 位置(即之前保存的下一個節點)。
  • 結果處理:循環結束后,pre 指向反轉后鏈表的新頭節點,返回 pre。

代碼實現:

// 雙指針
class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode cur = head;ListNode temp = null;while (cur != null) {temp = cur.next;// 保存下一個節點cur.next = prev;prev = cur;cur = temp;}return prev;}

LeetCode24. 兩兩交換鏈表中的節點


這道題目正常模擬就可以了。

建議使用虛擬頭結點,這樣會方便很多,要不然每次針對頭結點(沒有前一個指針指向頭結點),還要單獨處理。

接下來就是交換相鄰兩個元素了,此時一定要畫圖,不畫圖,操作多個指針很容易亂,而且要操作的先后順序

初始時,cur指向虛擬頭結點,然后進行如下三步:

操作之后,鏈表如下:

看這個可能就更直觀一些了:

代碼實現:

public ListNode swapPairs(ListNode head) {ListNode dummy = new ListNode(0, head);ListNode cur = dummy;while (cur.next != null && cur.next.next != null) {ListNode node1 = cur.next;// 第 1 個節點ListNode node2 = cur.next.next;// 第 2 個節點cur.next = node2; // 步驟 1node1.next = node2.next;// 步驟 3node2.next = node1;// 步驟 2cur = cur.next.next;}return dummy.next;
}

LeetCode19. 刪除倒數第n個節點


雙指針的經典應用,如果要刪除倒數第n個節點,讓fast移動n步,然后讓fast和slow同時移動,直到fast指向鏈表末尾。刪掉slow所指向的節點就可以了。

分為如下幾步:

  • 定義fast指針和slow指針,初始值為虛擬頭結點,如圖:

  • fast首先走n + 1步 ,為什么是n+1呢,因為只有這樣同時移動的時候slow才能指向刪除節點的上一個節點(方便做刪除操作),如圖:?

  • fast和slow同時移動,直到fast指向末尾,如題:?

  • 刪除slow指向的下一個節點,如圖:?

代碼實現:

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {//新建一個虛擬頭節點指向headListNode dummyNode = new ListNode(0);dummyNode.next = head;//快慢指針指向虛擬頭節點ListNode fastIndex = dummyNode;ListNode slowIndex = dummyNode;// 只要快慢指針相差 n 個結點即可for (int i = 0; i <= n; i++) {fastIndex = fastIndex.next;}while (fastIndex != null) {fastIndex = fastIndex.next;slowIndex = slowIndex.next;}// 此時 slowIndex 的位置就是待刪除元素的前一個位置。// 具體情況可自己畫一個鏈表長度為 3 的圖來模擬代碼來理解// 檢查 slowIndex.next 是否為 null,以避免空指針異常if (slowIndex.next != null) {slowIndex.next = slowIndex.next.next;}return dummyNode.next;}
}

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

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

相關文章

學習嵌入式的第三十一天-數據結構-(2025.7.23)網絡協議封裝

今天的內容主要是網絡協議以及常用工具的介紹。協議頭與數據封包/拆包數據封包示例&#xff1a;MAC|IP|TCP|hello| ———————————— IP數據報IP頭信息默認20字節常用網絡測試工具telnetnetstatpingarpwiresharktcpdumpssh2secure crt工具安裝命令sudo ufw disable sud…

STL學習(十、常用排序、拷貝、替換算法)

目錄 一、常用排序算法 1.sort (1) 內置數據類型 (2)自定義數據類型 2. random_shuffle(iterator beg, iterator end) 3.merge 4.reverse 二、常用的拷貝和替換算法 1.copy(起始不如直接賦值) 2.replace 3.replace_if 4.swap 一、常用排序算法 1.sort 函數原型 s…

【Datawhale AI夏令營】科大訊飛AI大賽(大模型技術)/夏令營:讓AI理解列車排期表(Task3)

我沒招了jpgimport pandas as pd import requests import re import json from tqdm import tqdm from datetime import datetime, timedeltadef calculate_stop_duration(arrival_time_str, departure_time_str):"""計算列車停留時長&#xff0c;處理跨天和異常…

【前后端】node mock.js+json-server

JSON-Server 一個在前端本地運行&#xff0c;可以存儲json數據的server。前端開發可以模擬服務端接口數據&#xff0c;在本地搭建一個JSON服務&#xff0c;自己產生測試數據。 使用npm全局安裝json-server &#xff1a;npm install -g json-server可以通過查看版本號&#xff0…

疏老師-python訓練營-Day30模塊和庫的導入

浙大疏錦行 知識點回顧&#xff1a; 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯&#xff1a;找到根目錄&#xff08;python解釋器的目錄和終端的目錄不一致&#xff09; 作業&#xff1a;自己新建幾個不同路徑文件嘗試下如何導入 一.學習知識點 DAY30 …

神經網絡知識討論

AI 核心任務與數據類型&#xff1a;特征提取核心&#xff1a;AI 的核心是從原始輸入數據中提取特征&#xff0c;CV 是將圖像數據轉換為計算機可識別的特征&#xff0c;NLP 是將文本數據轉換為特征&#xff0c;數據挖掘是將結構化數據轉換為特征。數據類型特點&#xff1a;圖像數…

kotlin類型可為空,進行空安全的區別

定義一個可為空的變量b(String?),默認沒有&#xff1f;是不可以為空的 var b: String? "Kotlin" b null print(b) // 輸出 null默認不可為空 var a: String "Kotlin" a null // 編譯器報錯&#xff0c;null 不能被賦給不為空的變量空安全調用&#x…

Mysql事務基礎

事務是一個不可分割的數據庫操作序列&#xff0c;也是數據庫并發控制的基本單位&#xff0c;其執行的結果必須使數據庫從一種一致性狀態變到另一種一致性狀態。事務是邏輯上的一組操作&#xff0c;要么都執行&#xff0c;要么都不執行 事務的特點 A&#xff08;Atomicity&#…

FastAPI入門:安裝、Pydantic、并發和并行

本系列參考FastAPI官方文檔&#xff1a;https://fastapi.tiangolo.com/zh/python-types/安裝 使用pip安裝&#xff1a; pip install fastapi此外還需要 ASGI 服務器&#xff0c;生產環境可以使用 Uvicorn 或者 Hypercorn。 ASGI服務器&#xff1a;異步服務網關接口&#xff0c;…

歡樂的周末 - 華為OD統一考試(JavaScript 題解)

題目描述 小華和小為是很要好的朋友,他們約定周末一起吃飯。 通過手機交流,他們在地圖上選擇了多個聚餐地點(由于自然地形等原因,部分聚餐地點不可達)。 求小華和小為都能到達的聚餐地點有多少個? 輸入描述 第一行輸入m和n,m代表地圖的長度,n代表地圖的寬度 第二行…

算法競賽階段二-數據結構(38)數據結構動態鏈表list

動態鏈表&#xff08;List&#xff09;的基本概念動態鏈表是一種線性數據結構&#xff0c;通過節點間的指針連接實現動態內存分配。與數組不同&#xff0c;鏈表的大小可隨需增減&#xff0c;插入和刪除操作的時間復雜度為 O(1)&#xff08;已知位置時&#xff09;&#xff0c;但…

Qt 移動應用推送通知實現

推送通知是移動應用提升用戶粘性的核心功能——無論是即時消息提醒、活動推送還是狀態更新&#xff0c;都需要通過推送功能觸達用戶。Qt雖未直接提供跨平臺推送API&#xff0c;但可通過集成原生服務&#xff08;如Firebase Cloud Messaging、Apple Push Notification service&a…

Word和WPS文字如何制作分欄試卷?想分幾欄分幾欄

使用Word和WPS文字制作試卷的時候&#xff0c;通常會使用A3大小的紙張&#xff0c;橫向布局。但是如果題目的題干、問題、選項文字太少&#xff0c;會帶來試卷上有較大的空白&#xff0c;既不美觀又浪費紙&#xff0c;解決辦法就是將試卷分欄&#xff0c;根據需要分成多欄&…

ubuntu 安裝vmware tools

VMware Workstation菜單欄->虛擬機->安裝VMware Tools 打開ubuntu內加載的光盤&#xff0c;復制VMwareTools-10.3.26-22085142.tar.gz&#xff0c;解壓出來 sudo ./vmware-install.pl #執行安裝軟件 VMware Tools 安裝完成以后重啟Ubuntu&#xff0c;重啟以后就可以直…

【實時Linux實戰系列】在實時應用中進行負載均衡

在實時應用中&#xff0c;負載均衡是確保系統能夠高效處理多個任務的關鍵技術。通過合理調度任務到不同的處理單元&#xff0c;負載均衡可以提高系統的整體性能&#xff0c;減少延遲&#xff0c;并提高資源利用率。在實時 Linux 系統中&#xff0c;負載均衡尤為重要&#xff0c…

bash的特性-命令和文件自動補全

一、前言在 Linux Shell 編程和日常使用中&#xff0c;Bash 的自動補全功能 是一個非常強大且實用的特性。它不僅可以節省輸入時間&#xff0c;還能有效減少拼寫錯誤&#xff0c;提升命令執行效率。本文將帶你全面了解 Bash 的自動補全機制&#xff0c;包括&#xff1a;? 命令…

Ubuntu系統 系統盤和數據盤擴容具體操作

Linux磁盤配置和需求&#xff0c;以下是完整的操作方案&#xff1a; 可以看到系統盤vda3 還有48GB 數據盤則是還有512GB沒有掛載使用&#xff0c;下面是完成數據擴容的具體操作 一、完成系統盤擴容&#xff08;使用98GB空間&#xff09; # 1. 擴展邏輯卷&#xff08;LVM架構&am…

從0到1學Pandas(七):Pandas 在機器學習中的應用

目錄一、數據預處理1.1 特征提取1.2 數據標準化與歸一化1.3 特征編碼二、特征工程2.1 特征選擇?2.2 特征組合與衍生?2.3 缺失值處理策略?三、模型訓練與評估3.1 數據集劃分3.2 模型訓練與預測3.3 模型評估與調優四、Pipeline 構建4.1 自動化工作流4.2 模型部署與應用4.3 模型…

LangChain和LangGraph 里面的 `create_react_agent`有什么不同

這兩個函數雖然名稱相同&#xff0c;但來自不同的庫&#xff08;LangChain 和 LangGraph&#xff09;&#xff0c;它們在實現和使用上有一些關鍵區別&#xff1a; 主要區別特性LangChain 的 create_react_agentLangGraph 的 create_react_agent所屬庫LangChainLangGraph設計目的…

PostgreSQL 與 Oracle 數據庫字段類型的詳細對比

一、數值類型對比數據類型OraclePostgreSQL說明整數NUMBER(p,0)SMALLINT/INT/BIGINTOracle 統一用 NUMBER&#xff0c;PG 區分精度范圍浮點數BINARY_FLOATREAL單精度浮點雙精度浮點BINARY_DOUBLEDOUBLE PRECISION雙精度浮點高精度小數NUMBER(p,s)NUMERIC(p,s)精確數值存儲自增序…