力扣經典算法篇-25-刪除鏈表的倒數第 N 個結點(計算鏈表的長度,利用棧先進后出特性,雙指針法)

1、題干

給你一個鏈表,刪除鏈表的倒數第 n 個結點,并且返回鏈表的頭結點。

示例 1:
在這里插入圖片描述
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]

示例 2:
輸入:head = [1], n = 1
輸出:[]

示例 3:
輸入:head = [1,2], n = 1
輸出:[1]

提示:
鏈表中結點的數目為 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

2、解題

前提給定:(鏈表節點的定義和鏈表的形成)

鏈表節點定義如下:

// 鏈表節點
public class ListNode {int val;ListNode next;ListNode() {}ListNode(int x) {val = x;}
}

鏈表構建過程示例:(如上示例1)

public static void main(String[] args) {ListNode node1 = new ListNode(1);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(3);ListNode node4 = new ListNode(4);ListNode node5 = new ListNode(5);node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node5;ListNode node = removeNthFromEnd(node1, 2);while (node != null) {System.out.println(node.val);node = node.next;}}

方法一:(計算鏈表長度)

通過一個臨時節點,指向頭結點,依次遍歷到尾節點,計算遍歷的次數得到鏈表的長度;
結合鏈表的長度和倒數的位置,可以得到正序要刪除節點的位置。
正向遍歷到該位置的前一個元素,進行刪除節點。

代碼示例:

 public static ListNode removeNthFromEnd(ListNode head, int n) {ListNode preResult = new ListNode();preResult.next = head;ListNode pre = preResult;  // 臨時變量,找到要刪除的位置,進行刪除ListNode tail = head;    // 尾指針,用于遍歷到尾部,找到鏈表的長度// 找到鏈表長度,計算得到要刪除的節點位置。int len = 0;while (tail!=null){len++;tail = tail.next;}int position = len - n;   // 得到正序要刪除節點的位置下標// 找到位置,刪除元素for (int i = 0; i < position; i++) {pre = pre.next;}ListNode next = pre.next;    // 找到要刪除的節點nextpre.next = next.next;   // 斷開pre和next的指向關系,使pre指向enxt的后面節點next.next = null;  // next與鏈表測地斷開return preResult.next;}

方法二:(利用棧的先進后出特性)

將所有的節點添加到棧中,那么倒數第N個節點,實際就是棧頂向下的第N節點。
依次出站N個元素,那么此時棧頂元素就是要刪除節點的前一個元素。此時回到鏈表直接刪除當前元素的下一個元素即可。

代碼示例:

 public static ListNode removeNthFromEnd(ListNode head, int n) {ListNode preResult = new ListNode();preResult.next = head;ListNode pre = preResult;  // 中間變量,依次入棧操作用// 通過pre使鏈表元素依次入棧Stack<ListNode> stack = new Stack<>();while (pre!=null){stack.push(pre);pre = pre.next;}// 彈出元素,將目標位置元素和后面的元素全部彈出for (int i = 0; i < n; i++) {stack.pop();}// 此時,站頂元素為目標元素的前一個元素if (!stack.isEmpty()){pre = stack.peek();// 刪除目標元素pre.next = pre.next.next;} else {return new ListNode();}return preResult.next;}

方法三:(雙指針法)

利用兩個指針。
第一個還真向前遍歷N個元素,第二個指針指向起點。兩個指針之間的距離就是N。
之后,兩個指針一起向后移動,因為兩個指針距離N,當第一個指針達到尾部的時候,那么此時第二個節點剛好就是要刪除的節點。
實際為了刪除,我們要獲取的是目標刪除節點的前一個節點。所以第二個指針初始化應該是鏈表頭結點的前驅節點。

代碼示例:

 public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0, head);ListNode first = head;ListNode second = dummy;for (int i = 0; i < n; ++i) {first = first.next;}while (first != null) {first = first.next;second = second.next;}second.next = second.next.next;ListNode ans = dummy.next;return ans;}

向陽出發,Dare To Be!!!

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

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

相關文章

VIT速覽

當我們取到一張圖片&#xff0c;我們會把它劃分為一個個patch&#xff0c;如上圖把一張圖片劃分為了9個patch&#xff0c;然后通過一個embedding把他們轉換成一個個token&#xff0c;每個patch對應一個token&#xff0c;然后在輸入到transformer encoder之前還要經過一個class …

【服務器與部署 14】消息隊列部署:RabbitMQ、Kafka生產環境搭建指南

【服務器與部署 14】消息隊列部署&#xff1a;RabbitMQ、Kafka生產環境搭建指南 關鍵詞&#xff1a;消息隊列、RabbitMQ集群、Kafka集群、消息中間件、異步通信、微服務架構、高可用部署、消息持久化、生產環境配置、分布式系統 摘要&#xff1a;本文從實際業務場景出發&#x…

LeetCode中等題--167.兩數之和II-輸入有序數組

1. 題目 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < index1 < index2 <…

【C# in .NET】19. 探秘抽象類:具體實現與抽象契約的橋梁

探秘抽象類:具體實現與抽象契約的橋梁 在.NET類型系統中,抽象類是連接具體實現與抽象契約的關鍵橋梁,它既具備普通類的狀態承載能力,又擁有類似接口的行為約束特性。本文將從 IL 代碼結構、CLR 類型加載機制、方法調度邏輯三個維度,全面揭示抽象類的底層工作原理,通過與…

Apache RocketMQ + “太乙” = 開源貢獻新體驗

Apache RocketMQ 是 Apache 基金會托管的頂級項目&#xff0c;自 2012 年誕生于阿里巴巴&#xff0c;服務于淘寶等核心交易系統&#xff0c;歷經多次雙十一萬億級數據洪峰穩定性驗證&#xff0c;至今已有十余年發展歷程。RocketMQ 致力于構建低延遲、高并發、高可用、高可靠的分…

永磁同步電機控制算法--弱磁控制(變交軸CCR-VQV)

一、原理介紹CCR-FQV弱磁控制不能較好的利用逆變器的直流側電壓&#xff0c;造成電機的調速范圍窄、效率低和帶載能力差。為了解決CCR-FQV弱磁控制存在的缺陷&#xff0c;可以在電機運行過程中根據工況的不同實時的改變交軸電壓給定uq?的值&#xff0c;實施 CCR-VQV弱磁控制。…

達夢數據守護集群搭建(1主1實時備庫1同步備庫1異步備庫)

目錄 1 環境信息 1.1 目錄信息 1.2 其他環境信息 2 環境準備 2.1 新建dmdba用戶 2.2 關閉防火墻 2.3 關閉Selinux 2.4 關閉numa和透明大頁 2.5 修改文件打開最大數 2.6 修改磁盤調度 2.7 修改cpufreq模式 2.8 信號量修改 2.9 修改sysctl.conf 2.10 修改 /etc/sy…

電感與電容充、放電極性判斷和電感選型

目錄 一、電感 二、電容 三、電感選型 一、電感 充電&#xff1a;左右-為例 放電&#xff1a;極性相反&#xff0c;左-右 二、電容 充電&#xff1a;左右-為例 放電&#xff1a;左右-&#xff08;與充電極性一致&#xff09; 三、電感選型 主要考慮額定電流和飽和電流。…

新建模范式Mamba——“Selectivity is All You Need?”

目錄 一、快速走進和理解Mamba建模架構 &#xff08;一&#xff09;從Transformer的統治地位談起 &#xff08;二&#xff09;另一條道路&#xff1a;結構化狀態空間模型&#xff08;SSM&#xff09; &#xff08;三&#xff09;Mamba 的核心創新&#xff1a;Selective SSM…

Python實現Word文檔中圖片的自動提取與加載:從理論到實踐

在現代辦公和文檔處理中&#xff0c;Word文檔已經成為最常用的文件格式之一。這些文檔不僅包含文本內容&#xff0c;還經常嵌入各種圖片、圖表和其他媒體元素。在許多場景下&#xff0c;我們需要從Word文檔中提取這些圖片&#xff0c;例如進行內容分析、創建圖像數據庫、或者在…

Kafka、RabbitMQ 與 RocketMQ 高可靠消息保障方案對比分析

Kafka、RabbitMQ 與 RocketMQ 高可靠消息保障方案對比分析 在分布式系統中&#xff0c;消息隊列承擔著異步解耦、流量削峰、削峰填谷等重要職責。為了保證應用的數據一致性和業務可靠性&#xff0c;各大消息中間件都提供了多種高可靠消息保障機制。本文以Kafka、RabbitMQ和Rock…

四足機器人遠程視頻與互動控制的全鏈路方案

隨著機器人行業的快速發展&#xff0c;特別是四足仿生機器人在巡檢、探測、安防、救援等復雜環境中的廣泛部署&#xff0c;如何實現高質量、低延遲的遠程視頻監控與人機互動控制&#xff0c;已經成為制約其應用落地與規模化推廣的關鍵技術難題。 四足機器人常常面臨以下挑戰&a…

把leetcode官方題解自己簡單解釋一下

自用自用&#xff01;&#xff01;&#xff01;leetcode hot 100

hive的sql優化思路-明白底層運行邏輯

一、首先要明白底層map、shuffle、reduce的順序之中服務器hdfs數據文件在內存與存儲之中是怎么演變的&#xff0c;因為hive的性能瓶頸基本在內存&#xff0c;具體參考以下他人優秀文章&#xff1a; 1.Hive SQL底層執行過程詳細剖析 2.Hive JOIN性能調優 二是要明白hive對應的…

驅動隔離芯片在現代工業上的卓越貢獻

在智能時代的精密齒輪中&#xff0c;驅動隔離芯片如同一位精通跨界語言的“安全架構師”&#xff0c;在高壓與低壓、危險與精密的交界處重構秩序。它不生產數據&#xff0c;卻是信息的守門人&#xff1b;不創造能量&#xff0c;卻是電流的馴獸師。從鋼鐵叢林到生命方舟&#xf…

使用MATLAB探索圓周率π的奇妙計算之旅

在數學的璀璨星河中,圓周率π無疑是最耀眼的明星之一。這個看似簡單的無理數蘊含著宇宙的奧秘,吸引著無數科學家和數學愛好者探索其計算方法。今天,我們將使用MATLAB這一強大的科學計算工具,踏上π的計算之旅,體驗從古典算法到現代技巧的奇妙過程。 1. 蒙特卡洛法:隨機的…

React 服務器組件 (RSC)

文章目錄前言1. 什么是服務器組件 (Server Components)?2. 服務器組件的核心規則(1) 異步性 (async/await)(2) 無客戶端交互(3) 渲染限制3. 與客戶端組件的協作組合模式Props 傳遞規則4. 使用場景5. 文件命名約定6. 常見誤區7. 示例代碼服務端組件&#xff08;獲取數據&#x…

如何解決AttributeError: ‘NoneType‘ object has no attribute問題

如何解決AttributeError: ‘NoneType’ object has no attribute問題 問題背景與概述 在 Python 項目開發和調試過程中&#xff0c;經常會碰到這樣一個異常信息&#xff1a; AttributeError: NoneType object has no attribute foo這意味著你嘗試訪問或調用某個對象的屬性&a…

量子計算與AI融合的技術突破與實踐路徑

量子計算與人工智能的融合正開啟一個全新的技術紀元&#xff0c;這種"量智融合"不是簡單的技術疊加&#xff0c;而是多領域、多學科的橫向連接&#xff0c;通過協同創新實現非線性增長。本文將深入探討這一領域的最新進展、技術實現路徑以及行業應用案例。電子-光子-…

xss的利用

目錄 一、XSS的原理和分類 二、常見的XSS標簽和屬性 三、Xss漏洞分類 1. 反射性xss 反射性 XSS 典型攻擊場景 基于 URL 參數的反射性 XSS 基于表單參數的反射性 XSS 利用 HTML 標簽屬性的反射性 XSS 2.存儲型XSS 存儲型XSS的高頻攻擊場景 社交平臺評論區 論壇發帖與…