鏈表專題-02

鏈表專題


/*** 鏈表的節點* @param <E>*/
public class ListNode<E> {public E element;public ListNode<E> next;public ListNode() {}public ListNode(E element) {this.element = element;}public ListNode(E element, ListNode<E> next) {this.element = element;this.next = next;}@Overridepublic String toString() {return "ListNode{" +"element=" + element +", next=" + next +'}';}
}

鏈表結構

image-20241007203444370


public class MyLinkedList<E> {private ListNode<E> head;public ListNode<E> getHead() {return head;}public void setHead(ListNode<E> head){this.head = head;}public void add(E data) {ListNode<E> newNode = new ListNode<>(data);if (head == null) {head = newNode;return;}ListNode<E> curr = head;while (curr.next != null) curr = curr.next;curr.next = newNode;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();ListNode<E> curr = this.head;while (curr != null) {sb.append(curr.element).append("-->");curr = curr.next;}sb.delete(sb.length() - 3, sb.length());return sb.toString();}
}

經典問題

反轉鏈表II

問題

[力扣92] 92. 反轉鏈表 II - 力扣(LeetCode)

問題描述

給你單鏈表的頭指針 head 和兩個整數 leftright ,其中 left <= right 。請你反轉從位置 left 到位置 right 的鏈表節點,返回 反轉后的鏈表

示例 1:

img

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

示例 2:

輸入:head = [5], left = 1, right = 1
輸出:[5]
解決方案

定義虛擬頭節點dummy, 要操作節點的前一個節點pre(默認為null), 尋找的反轉節點的前一個節點first(默認指向dummy節點)

index記錄查找到left的步數,tips:left位置從1開始計算,所以我們要尋找的位置應該left-1;

image-20241010160811119

移動first索引查找要操作的元素的前一個節點(節點1)。

image-20241010161036161

記錄當前要操作的節點curr,使用curr對要求的節點進行反轉操作。

  1. Node next = curr.next;
  2. curr.next = pre;
  3. pre = curr;
  4. curr = next;

image-20241010162218836

image-20241010163514401

重復執行操作2,3,4節點,出循環后

  1. first.next.next = curr; //即節點2 連接節點5
  2. first.next = pre; //即節點1連接要操作的最后一個節點

image-20241010163328626

image-20241010163813255

ListNode<Integer> dummy = new ListNode<>(-1, head);
ListNode<Integer> pre = null;
ListNode<Integer> first = dummy;for (int i = 0; i < left - 1; i++) {first = first.next;
}ListNode<Integer> curr = first.next;for (int i = 0; i <= (right - left); i++) {ListNode<Integer> next = curr.next;curr.next = pre;pre = curr;curr = next;
}first.next.next = curr;
first.next = pre;return dummy.next;

刪除鏈表中中重復元素

問題

[力扣83] 83. 刪除排序鏈表中的重復元素 - 力扣(LeetCode)

問題描述

給定一個已排序的鏈表的頭 head刪除所有重復的元素,使每個元素只出現一次 。返回 已排序的鏈表

示例 1:

img

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

示例 2:

img

輸入:head = [1,1,2,3,3]
輸出:[1,2,3]
解決方案

定義要移動的節點curr: curr = head

image-20241010164114608

如果當前curr的值與curr.next的值相等,則斷開此節點連接下一個節點(2),否則移動curr索引

if(curr.val == curr.next.val) curr.next = curr.next.next;
else

curr = curr.next;

image-20241010164735796

 public ListNode deleteDuplicates(ListNode head) {ListNode dummy = new ListNode(-1, head);ListNode curr = dummy.next;while (curr.next != null) {if (curr.val == curr.next.val) {curr.next = curr.next.next;} else {curr = curr.next;}}return dummy.next;}

刪除鏈表中節點

問題

[力扣237] 237. 刪除鏈表中的節點 - 力扣(LeetCode)

問題描述

有一個單鏈表的 head,我們想刪除它其中的一個節點 node。給你一個需要刪除的節點 node 。你將 無法訪問 第一個節點 head

鏈表的所有值都是 唯一的,并且保證給定的節點 node 不是鏈表中的最后一個節點。刪除給定的節點。注意,刪除節點并不是指從內存中刪除它。這里的意思是:

  • 給定節點的值不應該存在于鏈表中。
  • 鏈表中的節點數應該減少 1。
  • node 前面的所有值順序相同。
  • node 后面的所有值順序相同。

自定義測試:

  • 對于輸入,你應該提供整個鏈表 head 和要給出的節點 nodenode 不應該是鏈表的最后一個節點,而應該是鏈表中的一個實際節點。
  • 我們將構建鏈表,并將節點傳遞給你的函數。
  • 輸出將是調用你函數后的整個鏈表。

示例 1:

img
輸入:head = [4,5,1,9], node = 5
輸出:[4,1,9]
解釋:指定鏈表中值為 5 的第二個節點,那么在調用了你的函數之后,該鏈表應變為 4 -> 1 -> 9

示例 2:

img
輸入:head = [4,5,1,9], node = 1
輸出:[4,5,9]
解釋:指定鏈表中值為 1 的第三個節點,那么在調用了你的函數之后,該鏈表應變為 4 -> 5 -> 9

提示:

  • 鏈表中節點的數目范圍是 [2, 1000]
  • -1000 <= Node.val <= 1000
  • 鏈表中每個節點的值都是 唯一
  • 需要刪除的節點 node鏈表中的節點 ,且 不是末尾節點
解決方案
image-20241011172032702
 public void deleteNode(ListNode node) {node.val=node.next.val;node.next=node.next.next;}

移除鏈表元素

問題

[力扣203] 203. 移除鏈表元素 - 力扣(LeetCode)

問題描述

給你一個鏈表的頭節點 head 和一個整數 val ,請你刪除鏈表中所有滿足 Node.val == val 的節點,并返回 新的頭節點

示例 1:

img

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

示例 2:

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

示例 3:

輸入:head = [7,7,7,7], val = 7
輸出:[]
解決方案

遞歸退出條件 :if(curr.next ==null) return null;

curr.next = null;

image-20241010171054474

判斷當前節點是否是要刪除的節點,如果是則刪除(即斷開下一個節點的連接)

if(curr.val == val){

return curr.next;

}else{

return curr;

}

image-20241010171515757

遞歸操作

image-20241010171612605

public ListNode<Integer> removeElementsx(ListNode<Integer> curr, int val) {if (curr == null) return null;curr.next = removeElementsx(curr.next,val);if(curr.val == val ){return curr.next;}else{return curr;}
}

移除鏈表元素II

問題

[力扣82] 82. 刪除排序鏈表中的重復元素 II - 力扣(LeetCode)

問題描述

給定一個已排序的鏈表的頭 head刪除原始鏈表中所有重復數字的節點,只留下不同的數字 。返回 已排序的鏈表

示例 1:

img

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

示例 2:

img

輸入:head = [1,1,1,2,3]
輸出:[2,3]
解決方案

定義虛擬頭結點dummy,操作節點curr指向dummy

image-20241010173217386

移動curr,防止越界 curr.next !=null && curr.next.next!=null,

獲取當前節點,使用中間節點tmp記錄 ListNode tmp = curr.next;

image-20241011171107180

判斷是和相鄰的節點是否相等(curr.next.next: 節點2)

if(curr.next.next.val ==val){

//循環刪除節點

while(curr.next !=null && curr.next.val == val){

? curr.next = curr.next.next;

? }

}

image-20241011171221695


從鏈表中移除節點

問題

[力扣2487] 2487. 從鏈表中移除節點 - 力扣(LeetCode)

題目描述

給你一個鏈表的頭節點 head 。移除每個右側有一個更大數值的節點。返回修改后鏈表的頭節點 head

示例 1:

image-20241011172701905

輸入:head = [5,2,13,3,8]
輸出:[13,8]
解釋:需要移除的節點是 523- 節點 13 在節點 5 右側。
- 節點 13 在節點 2 右側。
- 節點 8 在節點 3 右側。

示例 2:

輸入:head = [1,1,1,1]
輸出:[1,1,1,1]
解釋:每個節點的值都是 1 ,所以沒有需要移除的節點。
解決方案

image-20241011173656387


給你一個鏈表的頭節點 head 。移除每個右側有一個更大數值的節點。返回修改后鏈表的頭節點 head

示例 1:

[外鏈圖片轉存中…(img-1wS0djH7-1739015221466)]

輸入:head = [5,2,13,3,8]
輸出:[13,8]
解釋:需要移除的節點是 523- 節點 13 在節點 5 右側。
- 節點 13 在節點 2 右側。
- 節點 8 在節點 3 右側。

示例 2:

輸入:head = [1,1,1,1]
輸出:[1,1,1,1]
解釋:每個節點的值都是 1 ,所以沒有需要移除的節點。
解決方案

在這里插入圖片描述

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

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

相關文章

外部中斷實驗 #STM32F407

外部中斷實驗 此實驗將外部中斷配置為按鍵輸入&#xff0c;通過按鍵輸入觸發外部中斷&#xff0c;在外部中斷里面實施相應的處理&#xff0c;具體功能&#xff1a; 按下KEY0&#xff0c;翻轉LED0狀態按下KEY1&#xff0c;翻轉LED1狀態按下KEY2&#xff0c;同時翻轉LED0和LED1…

java中如何給內部類的屬性賦值

在 Java 中&#xff0c;內部類的屬性賦值方式取決于該屬性的訪問修飾符、內部類的類型&#xff08;非靜態或靜態&#xff09;&#xff0c;以及賦值的時機。以下是幾種常見的方式&#xff1a; 1. 通過構造方法賦值 class Outer {class Inner {private String name;// 構造方法賦…

機器學習8-卷積和卷積核1

機器學習8-卷積和卷積核1 卷積與圖像去噪卷積的定義與性質定義性質卷積的原理卷積步驟卷積的示例與應用卷積的優缺點優點缺點 總結 高斯卷積核卷積核尺寸的設置依據任務類型考慮數據特性實驗與調優 高斯函數標準差的設置依據平滑需求結合卷積核尺寸實際應用場景 總結 圖像噪聲與…

SVN 提交與原有文件類型不一樣的文件時的操作

SVN 提交與原有文件類型不一樣的文件時的操作 背景 SVN 服務器上原本的文件是軟鏈接類型的&#xff0c;但是我將它改成普通文件再上傳。出現了以下提示&#xff1a; 解決過程 本來想著通過 svn rm 和 svn add 來解決&#xff0c;但是行不通。 最終解決方案 svn rm --keep-…

阿里云專有云網絡架構學習

阿里云專有云網絡架構 葉脊&#xff08;spine-leaf&#xff09;網絡和傳統三層網絡拓撲對比 阿里云網絡架構V3拓撲角色介紹推薦設備設備組網舉例帶外管理網絡帶外網和帶內網對比設備介紹 安全網絡設備介紹 參考 后續更新流量分析葉脊&#xff08;spine-leaf&#xff09;網絡和傳…

Deepseek本地部署指南:在linux服務器部署,在mac遠程web-ui訪問

1. 在Linux服務器上部署DeepSeek模型 要在 Linux 上通過 Ollama 安裝和使用模型&#xff0c;您可以按照以下步驟進行操作&#xff1a; 步驟 1&#xff1a;安裝 Ollama 安裝 Ollama&#xff1a; 使用以下命令安裝 Ollama&#xff1a; curl -sSfL https://ollama.com/download.…

3D數字化營銷:重塑家居電商新生態

隨著電商的蓬勃發展&#xff0c;網上訂購家具已成為眾多消費者的首選。然而&#xff0c;線上選購家具的諸多挑戰&#xff0c;如風格不匹配、尺寸不合適、定制效果不如預期以及退換貨不便等&#xff0c;一直困擾著消費者。為解決這些問題&#xff0c;家居行業急需一種全新的展示…

重塑“景區+商業”模式,打造特色文旅新體驗

重塑“景區商業”模式&#xff0c;打造特色文旅新體驗 近年來&#xff0c;旅游業蓬勃發展&#xff0c;旅游熱潮不斷升溫&#xff0c;游客消費觀念也隨之升級。為順應這一趨勢&#xff0c;各大景區紛紛探索打造特色文旅項目&#xff0c;以期吸引更多游客。然而&#xff0c;“景…

在亞馬遜云科技上云原生部署DeepSeek-R1模型(下)

在本系列的上篇中&#xff0c;我們介紹了如何通過Amazon Bedrock部署并測試使用了DeepSeek模型。在接下來的下篇中小李哥將繼續介紹&#xff0c;如何利用亞馬遜的AI模型訓練平臺SageMaker AI中的&#xff0c;Amazon Sagemaker JumpStart通過腳本輕松一鍵式部署DeepSeek預訓練模…

Kubernetes是什么?為什么它是云原生的基石

從“手工時代”到“自動化工廠” 想象一下&#xff0c;你正在經營一家工廠。在傳統模式下&#xff0c;每個工人&#xff08;服務器&#xff09;需要手動組裝產品&#xff08;應用&#xff09;&#xff0c;效率低下且容易出錯。而Kubernetes&#xff08;k8s&#xff09;就像一個…

Transformer 詳解:了解 GPT、BERT 和 T5 背后的模型

目錄 什么是 Transformer? Transformer如何工作? Transformer 為何有用? 常見問題解答:機器學習中的 Transformer 在技??術領域,突破通常來自于修復損壞的東西。制造第一架飛機的人研究過鳥類。萊特兄弟觀察了禿鷲如何在氣流中保持平衡,意識到穩定性比動力更重要。…

圖片webp格式動圖圖片

這是一個webp動圖1 這是一個webp動圖2 webp 圖像由gif 轉換 3

Spring(26) spring-security-oauth2 官方表結構解析

目錄 一、什么是 spring-security-oauth2&#xff1f;二、spring-security-oauth2 的表結構2.1 oauth_client_details 客戶端詳細信息表2.2 oauth_access_token 認證授權Token記錄表2.3 oauth_refresh_token 刷新授權Token記錄表2.4 oauth_code 授權Code記錄表 一、什么是 spri…

【R語言】plyr包和dplyr包

一、plyr包 plyr擴展包主要是實現數據處理中的“分割-應用-組合”&#xff08;split-apply-combine&#xff09;策略。此策略是指將一個問題分割成更容易操作的部分&#xff0c;再對每一部分進行獨立的操作&#xff0c;最后將各部分的操作結果組合起來。 plyr擴展包中的主要函…

【DeepSeek】DeepSeek小模型蒸餾與本地部署深度解析DeepSeek小模型蒸餾與本地部署深度解析

一、引言與背景 在人工智能領域&#xff0c;大型語言模型&#xff08;LLM&#xff09;如DeepSeek以其卓越的自然語言理解和生成能力&#xff0c;推動了眾多應用場景的發展。然而&#xff0c;大型模型的高昂計算和存儲成本&#xff0c;以及潛在的數據隱私風險&#xff0c;限制了…

程序員也可以這樣賺錢

最近有朋友和我交流了關于程序員副業的想法&#xff0c;我想借這個機會對目前軟件開發常用的兼職平臺做一個梳理。 以下是程序員接副業的靠譜平臺推薦&#xff0c;結合政策合規性、平臺口碑及實際操作性整理&#xff0c;覆蓋國內外主流選擇&#xff1a; 一、國內綜合型平臺 程序…

【AI】在Ubuntu中使用docker對DeepSeek的部署與使用

這篇文章前言是我基于部署好的deepseek-r1:8b模型跑出來的 關于部署DeepSeek的前言與介紹 在當今快速發展的技術環境中&#xff0c;有效地利用機器學習工具來解決問題變得越來越重要。今天&#xff0c;我將引入一個名為DeepSeek 的工具&#xff0c;它作為一種強大的搜索引擎&a…

代碼隨想錄算法【Day39】

Day39 198.打家劫舍 class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return nums[0];vector<int> dp(nums.size());dp[0] nums[0];dp[1] max(nums[0], nums[1]);for (int i 2; i < nums.size…

TCP三次握手全方面詳解

文章目錄 (1) 三次握手各狀態CLOSE狀態SYN_SENT狀態SYN_RECV狀態ESTABLISHED狀態 (2) 為什么握手時的seqnum是隨機值&#xff0c;以及acknum的功能(3) 三次握手中的半連接隊列&#xff08;SYN隊列&#xff09;和全連接隊列&#xff08;ACCEPT隊列&#xff09;半連接隊列全連接隊…

數據結構與算法-遞歸

單路遞歸 二分查找 /*** 主函數&#xff1a;執行二分查找。* * param a 要搜索的數組&#xff08;必須是已排序的&#xff09;* param target 目標值* return 返回目標值在數組中的索引&#xff1b;如果未找到&#xff0c;則返回 -1*/ public static int binarySearch(int[] …