算法:鏈表part02:24. 兩兩交換鏈表中的節點 + 19. 刪除鏈表的倒數第 N 個結點 + 面試題 02.07. 鏈表相交

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

題目:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
講解:https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html
復習可以先看視頻講解:(貼一張視頻講解的圖)

思想

  • 搞清while()循環的終止條件,鏈表長度為奇數、偶數都記得考慮
  • 交換兩個節點,需要定位到兩個節點之前的一個節點的位置

解題

/*** 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 swapPairs(ListNode head) {//先設置一個虛擬頭節點ListNode dummy=new ListNode(0,head);//讓cur指向兩個交換節點之前的節點ListNode cur=dummy;//當鏈表中元素個數為奇數時,cur.next.next==null為終止條件//當鏈表中元素個數為偶數時,cur.next==null為終止條件while(cur.next!=null&&cur.next.next!=null){//先暫存交換的第一個和兩個需要交換的元素的后一個元素(即1,2交換時,暫存節點1和3)ListNode temp=cur.next;ListNode temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;cur.next.next.next=temp1;//偏移curcur=temp;	//等價于cur = cur.next.next;}return dummy.next;}
}//參考答案,上面是我寫的,參考答案會比較清晰
// 將步驟 2,3 交換順序,這樣不用定義 temp 節點
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;
}

總結

和思想一樣嘍,主要在上面那張講解圖;

19. 刪除鏈表的倒數第 N 個結點

題目:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
文章講解:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html

思想

  • 用一個快指針fastIndex和一個慢指針lowIndex,讓快指針先走n+1個位置,這樣便可以保證兩指針之間的間隔為n,然后同時移動兩指針直至fastIndex到達鏈表尾后,lowIndex的下一個位置即為要刪除的倒數第n個節點;

解題

/*** 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 removeNthFromEnd(ListNode head, int n) {ListNode dummy=new ListNode(0,head);ListNode fastIndex=dummy;ListNode slowIndex=dummy;//讓fastIndex先走n+1個位置,這樣fastIndex和slowIndex之間就間隔n個元素for(int i=0;i<=n;i++){fastIndex=fastIndex.next;}while(fastIndex!=null){fastIndex=fastIndex.next;slowIndex=slowIndex.next;}if(slowIndex.next.next==null){slowIndex.next=null;return dummy.next;}//slowIndex的下一個元素即為需要刪除的元素slowIndex.next=slowIndex.next.next;return dummy.next;}}////這是參考答案,更好理解,上面我自己寫的
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;}
}

總結

記住思想的內容;

面試題 02.07. 鏈表相交

題目:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
文章講解:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html

思想

(1)方法一:

  • 先計算出兩條鏈表的長度,讓鏈表A固定一直為長鏈表,計算兩鏈表長度差值,讓鏈表A先移動差值個單位,使A鏈表剩余長度和B鏈表相等,然后同時遍歷兩鏈表并比較對應節點是否相同;

(2)方法二:

解題

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//分別遍歷兩個鏈表拿到鏈表長度ListNode curA=headA;int sizeA=0;ListNode curB=headB;int sizeB=0;while(curA!=null){curA=curA.next;sizeA++;}while(curB!=null){curB=curB.next;sizeB++;}curA=headA;curB=headB;//讓curA始終指向長鏈表,curB指向短鏈表if(sizeA<sizeB){//交換curA和BListNode temp=curA;curA=curB;curB=temp;//交換長度int temp1=sizeA;sizeA=sizeB;sizeB=temp1;}int gap=sizeA-sizeB;while(gap-->0){curA=curA.next;}while(curA!=null){if(curA==curB){return curA;}curA=curA.next;curB=curB.next;}return null;}
}////這是參考答案,更好理解,上面我自己寫的
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lenA = 0, lenB = 0;while (curA != null) { // 求鏈表A的長度lenA++;curA = curA.next;}while (curB != null) { // 求鏈表B的長度lenB++;curB = curB.next;}curA = headA;curB = headB;// 讓curA為最長鏈表的頭,lenA為其長度if (lenB > lenA) {//1. swap (lenA, lenB);int tmpLen = lenA;lenA = lenB;lenB = tmpLen;//2. swap (curA, curB);ListNode tmpNode = curA;curA = curB;curB = tmpNode;}// 求長度差int gap = lenA - lenB;// 讓curA和curB在同一起點上(末尾位置對齊)while (gap-- > 0) {curA = curA.next;}// 遍歷curA 和 curB,遇到相同則直接返回while (curA != null) {if (curA == curB) {return curA;}curA = curA.next;curB = curB.next;}return null;}}

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

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

相關文章

【Linux學習】(11)進程的概念

前言在上一章我們知道了什么是進程&#xff0c;并簡單了解了PCB。 本文我們將繼續深入學習進程概念相關知識點&#xff1a; 學習進程狀態&#xff0c;學會創建進程&#xff0c;掌握僵尸進程和孤兒進程&#xff0c;及其形成原因和危害了解進程調度&#xff0c;Linux進程優先級&a…

UniappDay04

1.登錄模塊-小程序快捷登錄定義接口&#xff0c;封裝 import { http } from /utils/httptype loginParams {code: stringencryptedData: stringiv: string } export const postLoginWxMinAPI (data: loginParams) > {return http({method: POST,url: /login/wxMin,data,})…

NPM/Yarn完全指南:前端開發的“基石“與“加速器“

開篇:當你第一次運行npm install時... "這node_modules文件夾怎么比我的項目代碼還大100倍?!" —— 每個前端新手第一次看到node_modules時的反應都出奇地一致。別擔心,今天我要帶你徹底搞懂這個讓項目"膨脹"的"罪魁禍首",以及如何用NPM/Y…

vue頁面自定義滾動條

效果圖實現思路 固定整個灰色滾動條的長度計算可滾動區域占整個可視視圖的比例&#xff0c;來確定橙色塊的長度監聽頁面滾動&#xff0c;計算橙色塊向右偏移距離 主要代碼 template&#xff1a; <div v-show"showBar" ref"barRef" class"scrollbar…

企業級JWT驗證最佳方案:StringUtils.hasText()

在企業級Java開發中&#xff0c;判斷JWT令牌是否有效的最全面且常用的方式是結合以下兩種方法&#xff1a; ? 推薦方案&#xff1a;StringUtils.hasText(jwt)&#xff08;Spring框架&#xff09; import org.springframework.util.StringUtils;if (!StringUtils.hasText(jwt))…

靈動畫布:快手可靈 AI 推出的多人協作 AI 創意工作臺

靈動畫布&#xff1a;快手可靈 AI 推出的多人協作 AI 創意工作臺 來源&#xff1a;Poixe AI 一、什么是靈動畫布 靈動畫布是快手旗下可靈 AI 于 2025 世界人工智能大會期間發布的全新創意工作臺功能。該功能集無限可視化畫布空間、多人實時協作及 AI 智能輔助于一體&#xf…

【Linux篇】進程間通信:進程IPC

目錄 共享內存空間 共享內存是在用戶空間還是內核空間&#xff1f;——用戶空間 共享內存的生命周期 如何使用共享內存 共享內存的權限 共享內存是進程間通信中&#xff0c;速度最快的方式&#xff1a; 共享內存的缺點&#xff1a; 進程間通信標準&#xff1a; system …

Kubernetes 存儲入門

目錄 Volume 的概念 Volume 的類型 通過 emptyDir 共享數據 編寫 emptyDir 的 Deployment 文件 部署該 Deployment 查看部署結果 登錄 Pod 中的第一個容器 登錄 Pod 中的第二個容器查看 /mnt 下的文件 刪除此 Pod 使用 HostPath 掛載宿主機文件 編寫 Deployment 文件…

深入理解Redission釋放鎖過程

lock.unlock();調用unlock方法&#xff0c;往下追Override public void unlock() {try {// 1. 執行異步解鎖操作并同步等待結果// - 獲取當前線程ID作為鎖持有者標識// - unlockAsync()觸發Lua腳本執行實際解鎖// - get()方法阻塞直到異步操作完成get(unlockAsync(Thread.curre…

四、計算機組成原理——第4章:指令系統

目錄 4.1指令系統 4.1.1指令集體系結構 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定長操作碼指令格式 4.1.4擴展操作碼指令格式 4.1.5指令的操作類型 1.數據傳送 2.算術和邏輯運算 3.移位操作 4.轉移操作 …

RAG面試內容整理-檢索器與生成器的解耦架構

在RAG系統中,檢索器(Retriever)與生成器(Generator)的解耦架構是實現靈活高效的關鍵設計。所謂解耦,即將檢索相關文檔和生成答案兩個步驟分開,由不同的模塊或模型負責。這種架構帶來的直接好處是模塊獨立優化:我們可以針對檢索任務微調或更換檢索模型,而不必影響生成模…

【2026畢業論文鴻蒙系統畢設選題】最新穎的基于HarmonyOS鴻蒙畢業設計選題匯總易過的精品畢設項目分享(建議收藏)?

文章目錄前言最新畢設選題&#xff08;建議收藏起來&#xff09;最新穎的鴻蒙畢業設計選題匯總100套易過的精品畢設項目分享畢設作品推薦&#x1f447;&#x1f447;&#x1f447;文未可免費咨詢畢設相關問題&#xff0c;點贊留言可送系統源碼&#x1f447;&#x1f447;&#…

超全!Linux 面試 100 題精選解析:網絡篇|16 個 Linux 網絡排查與配置必考題詳解

網絡&#xff0c;是 Linux 系統的神經系統。 一臺服務器再強大&#xff0c;沒有網絡連接也如孤島。尤其在實際運維與面試場景中&#xff0c;“網絡相關的問題”是高頻重災區&#xff0c;比如&#xff1a; IP 配置錯亂&#xff0c;連不上公網DNS 無響應&#xff0c;域名解析失敗…

在 CentOS 上安裝 FFmpeg

在 CentOS 上安裝 FFmpeg 可以通過以下兩種推薦方法實現&#xff08;以 CentOS 7/8 為例&#xff09;&#xff1a; 方法一&#xff1a;通過 RPM Fusion 倉庫安裝&#xff08;推薦&#xff09; # 1. 安裝 EPEL 倉庫 sudo yum install epel-release# 2. 啟用 RPM Fusion 倉庫 # C…

數據結構——圖(一、圖的定義)

一、圖的定義1、什么是圖&#xff1f;圖G(V,E) 如圖&#xff0c;無向圖G頂點集V{,,...,}&#xff0c;用|V|表示圖G的頂點個數如&#xff1a;V{A,B,C,D} ,|V|4邊集E{(u,v)|uV, vV}&#xff0c; 用|E|表示圖G的邊的條數如&#xff1a;E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推導式與生成器表達式

Python 列表推導式與生成器表達式在 Python 中&#xff0c;列表推導式&#xff08;List Comprehension&#xff09;和生成器表達式&#xff08;Generator Expression&#xff09;是處理序列數據的高效工具。它們不僅能簡化代碼&#xff0c;還能提升數據處理的效率。本文將詳細介…

XCF32PVOG48C Xilinx Platform Flash PROM

XCF32PVOG48C 是 Xilinx 公司推出的一款高容量、低功耗的 Platform Flash PROM&#xff08;平臺閃存配置芯片&#xff09;&#xff0c;專為 Xilinx FPGA 和 CPLD 系列產品提供非易失性配置存儲支持。憑借其 32 Mbit 的大容量與出色的系統兼容性&#xff0c;該芯片成為中高端 FP…

重復文件清理工具,附免費鏈接

鏈接:https://pan.baidu.com/s/1s_Zx1eHp5Y-XnbbGldIgvw?pwdkjex 提取碼:kjex 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦

【Spring Boot 快速入門】二、請求與響應

目錄請求響應請求Postman 工具簡單參數請求實體參數請求數組集合參數日期參數JSON 參數路徑參數響應請求響應 請求 Postman 工具 Postman 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件 作用&#xff1a;常用于進行接口測試 簡單參數請求 原始方式 在原始的…

高并發系統技術架構

&#xff08;點個贊&#xff0c;算法會給你推薦更多類似干貨 ~&#xff09; 口訣&#xff1a; CDN 扛靜態&#xff0c;WAF 防惡意&#xff1b;驗證碼攔機器&#xff1b; Nginx 先限流&#xff0c;Sentinel 再熔斷&#xff1b; Redis 扣庫存&#xff0c;MQ 異步寫&#xff1b; 對…