【數據結構】_鏈表經典算法OJ(力扣版)

目錄

1. 移除鏈表元素

1.1 題目描述及鏈接

1.2 解題思路

1.3 程序

2. 反轉鏈表

2.1 題目描述及鏈接

2.2 解題思路

2.3 程序

3. 鏈表的中間結點

3.1 題目描述及鏈接

3.2 解題思路

3.3 程序


1. 移除鏈表元素

1.1 題目描述及鏈接

原題鏈接:203. 移除鏈表元素 - 力扣(LeetCode)

題目描述:給你一個鏈表的頭節點 head 和一個整數 val ,

請你刪除鏈表中所有滿足 Node.val == val 的節點,并返回 新的頭節點 。

1.2 解題思路

思路1:創建一個新鏈表,遍歷原鏈表,將 Node.val != val的結點均尾插到新鏈表中。

思路2:創建鏈表結點curNode遍歷鏈表,并對應記錄該結點的前驅結點與后繼結點,刪除該結點后再對其余結點進行鏈接。

1.3 程序

以思路1為例:

1、創建新鏈表首先定義一個結點作為新鏈表的頭結點newHead,且須作為方法的返回值返回;

2、遍歷原鏈表判斷當前結點的val值,需定義一個結構體指針curNode用于遍歷原鏈表。

3、由于需將Node.val !=val的結點尾插至新鏈表,故需定義結構體指針變量newTail指向新鏈表的最后一個結。并在最后完成尾插后將newTail的后繼指針域置為NULL

4、考慮特殊情況及相應處理:

(1)原鏈表為空:即head=NULL,導致curNode=NULL,不會進入第一個while循環,但在newTail->next=NULL 時會導致空指針解引用操作,出現錯誤。故需對newTail是否為空進行單獨討論處理。

(2)新鏈表為空:即原鏈表所有結點數據域的值都等于val,導致newTail->next=NULL 時會導致空指針解引用操作,出現錯誤。同(1):需對newTail是否為空進行單獨討論處理

處理邏輯為:

若newTail為空,再newTail->next=NULL,否則直接返回newHead(newHead也為空)

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {// 創建一個空鏈表ListNode* newHead=NULL;ListNode* newTail=NULL;ListNode* curNode=head;while(curNode){if(curNode->val!=val){// 情況1:鏈表為空if(newHead==NULL){newHead=curNode;newTail=curNode;}// 情況2:鏈表不為空else{newTail->next=curNode;newTail=newTail->next;}}curNode=curNode->next;}// 將新鏈表尾結點的后繼指針置空// 討論新鏈表為空與非空的兩種情況if(newTail){newTail->next=NULL;}return newHead;
}

2. 反轉鏈表

2.1 題目描述及鏈接

題目鏈接:206. 反轉鏈表 - 力扣(LeetCode)

題目描述:給你單鏈表的頭節點 head ,請你反轉鏈表,并返回反轉后的鏈表。

2.2 解題思路

思路1:

創建一個新的鏈表,并定義頭結點指針newHead和尾結點指針newNode,遍歷原鏈表,依次取當前結點頭插到新鏈表中。

思路2:

無需創建新鏈表,創建三個指針,用于逐個逆轉指針指向。

2.3 程序

以思路2為例:

創建三個指針變量。初始情況下,令n1指向空,n2指向原鏈表的頭結點,n3指向原鏈表頭結點的下一個結點。

以n2作為修改當前指向結點的后繼指針域指向的用于遍歷的結構體指針,逐個翻轉指針域指向。再令n1、n2、n3依次后移。

考慮最終情況,n3最先變為空指針,直至n2指向原鏈表的最后一個結點完成指針域的指向反轉后,表示當前鏈表已完成反轉操作,故循環條件為n2不為空。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {// 判空if(head==NULL){return head;}// 創建三個指針ListNode* n1=NULL;ListNode* n2=head;ListNode* n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}

3. 鏈表的中間結點

3.1 題目描述及鏈接

題目鏈接:876. 鏈表的中間結點 - 力扣(LeetCode)

題目描述:

給你單鏈表的頭結點 head ,請你找出并返回鏈表的中間結點。
如果有兩個中間結點,則返回第二個中間結點。

3.2 解題思路

思路1:

遍歷原鏈表,使用count計數,count/2位置結點的下一個結點就是滿足條件的中間結點,可返回count/2位置結點的后繼指針即可。

思路2:快慢指針

創建兩個結構體指針變量,令一個指針每次走一步,另外一個指針每次走兩步,走得快的指針稱為fast快指針,走得慢的指針稱為slow慢指針。

3.3 程序

以思路二為例:考慮循環條件。

對于奇數個結點的鏈表,當fast->next=NULL時,slow正指向中間結點;

對于偶數個結點的鏈表,當fast=NULL時,slow正指向兩個中間結點的后一個節點;

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* slow=head;ListNode* fast=head;while(fast!=NULL&&fast->next!=NULL){fast=fast->next->next;slow=slow->next;}return slow;
}

注:對于循環條件while(fast!=NULL&&fast->next!=NULL)不可更改為

while(fast->next!=NULL&&fast!=NULL),由于在偶數個結點的鏈表中,當fast==NULL時,slow正指向兩個中間結點的后一個,此種情況下,若交換順序則會導致對空指針的解引用,出錯。

由于邏輯與具有短路特性,若已驗證操作符左側表達式為假,則不再驗右側表達式真假。

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

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

相關文章

編譯器gcc/g++ --【Linux基礎開發工具】

文章目錄 一、背景知識二、gcc編譯選項1、預處理(進行宏替換)2、編譯(生成匯編)3、匯編(生成機器可識別代碼)4、鏈接(生成可執行文件或庫文件) 三、動態鏈接和靜態鏈接四、靜態庫和動態庫1、動靜態庫2、編譯…

Java 注解與元數據

Java學習資料 Java學習資料 Java學習資料 一、引言 在 Java 編程中,注解(Annotation)和元數據(Metadata)是兩個重要的概念。注解為程序提供了一種在代碼中嵌入額外信息的方式,這些額外信息就是元數據。元…

操作系統指定用戶密碼永不過期

背景 實際生產環境中,數據中心操作系統通常會有基線要求(比如等保之類),要求設置操作系統密碼有效期,但是infra團隊或者操作系統管理員或者某些業務配置使用的操作系統用戶又需要密碼不能不停修改(或者說一…

無用的知識又增加了:is_assignable means?

std::pair的默認operator被delete掉了,取而代之的是兩個enable_if版本。 為什么這么設計,我的理解是在std::map里,已經保存的元素的key值是不能被修改的,比如 注意,下面的代碼會修改key值,編譯時出現錯誤…

能量提升法三:贊美

前情回顧: 《能量提升法二:感恩》 片段:“感恩,就像是在跟世界說:謝謝你,我收到了,我很喜歡,請多來點” 把它歸還人海,就當作每一個人,都有可能是曾經幫助…

25美賽ABCDEF題詳細建模過程+可視化圖表+參考論文+寫作模版+數據預處理

詳情見該鏈接!!!!!! 25美國大學生數學建模如何準備!!!!!-CSDN博客文章瀏覽閱讀791次,點贊13次,收藏7次。通過了解比賽基本…

2025企業繁體鏡像站鏡像站群版 | 干擾碼+拼音插入

技術背景 高效的SEO優化和內容采集是企業站群系統的核心競爭力。本文將詳細介紹一套企業級網站鏡像工具包,重點展示其在SEO優化、內容采集、智能處理等方面的創新實現。 系統特性 1. SEO優化功能 關鍵詞智能布局標題標簽優化鏈接結構優化移動端適配頁面加速優化…

動態規劃<九>兩個數組的dp

目錄 引例 LeetCode經典OJ題 1.第一題 2.第二題 3.第三題 4.第四題 5.第五題 6.第六題 7.第七題 引例 OJ傳送門LeetCode<1143>最長公共子序列 畫圖分析&#xff1a; 使用動態規劃解決 1.狀態表示 ------經驗題目要求 經驗為選取第一個字符串的[0,i]區間以及第二個字…

大數據學習之SCALA分布式語言三

7.集合類 111.可變set一 112.可變set二 113.不可變MAP集合一 114.不可變MAP集合二 115.不可變MAP集合三 116.可變map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前導入如下包 import scala . collection . mutable // 可變 Map 集合 object Ma…

MongoDB中常用的幾種高可用技術方案及優缺點

MongoDB 的高可用性方案主要依賴于其內置的 副本集 (Replica Set) 和 Sharding 機制。下面是一些常見的高可用性技術方案&#xff1a; 1. 副本集 (Replica Set) 副本集是 MongoDB 提供的主要高可用性解決方案&#xff0c;確保數據在多個節點之間的冗余存儲和自動故障恢復。副…

基于OSAL的嵌入式裸機事件驅動框架——整體架構調度機制

參考B站up主【架構分析】嵌入式祼機事件驅動框架 感謝大佬分享 任務ID &#xff1a; TASK_XXX TASK_XXX 在系統中每個任務的ID是唯一的&#xff0c;范圍是 0 to 0xFFFE&#xff0c;0xFFFF保留為SYS_TSK_INIT。 同時任務ID的大小也充當任務調度的優先級&#xff0c;ID越大&#…

WGCLOUD運維工具從入門到精通 - 如何設置主題背景

需要升級到WGCLOUD的v3.5.7或者以上版本&#xff0c;才會支持自定義設置主題背景色 WGCLOUD下載&#xff1a;www.wgstart.com 我們登錄后&#xff0c;在右上角點擊如下的小圖標&#xff0c;就可以設置主題背景色了&#xff0c;包括&#xff1a;經典白&#xff08;默認&#x…

LigerUI在MVC模式下的響應原則

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的開發模式&#xff0c;但是也具有其特色的偵聽函數&#xff0c;那么當LigerUI作為View層的時候&#xff0c;他所發送后端的必然是表單的數據&#xff0c;在此我們以倆個div為例&#xff1a; {Layout "~/View…

基于RIP的MGRE VPN綜合實驗

實驗拓撲 實驗需求 1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有IP地址&#xff1b; 2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方&#xff1b; R2與R5之間使用ppp的CHAP認證&#xff0c;R5為主認證方&#xff1b; R3與R5之間使用HDLC封…

git的理解與使用

本地的git git除了最經典的add commit push用來做版本管理&#xff0c;其實他的分支管理也非常強大 可以說你學好了分支管理&#xff0c;就可以完成團隊的配合協作了 git倉庫 我們可以使用git init來初始化一個git倉庫&#xff0c;只要能看見.git文件夾&#xff0c;就代表這…

Java 編程初體驗

Java學習資料 Java學習資料 Java學習資料 一、引言 在當今數字化的時代&#xff0c;編程已然成為一項極具價值的技能。而 Java 作為一門廣泛應用于企業級開發、移動應用、大數據等眾多領域的編程語言&#xff0c;吸引著無數初學者投身其中。當我們初次踏入 Java 編程的世界&…

STM32 對射式紅外傳感器配置

這次用的是STM32F103的開發板&#xff08;這里面的exti.c文件沒有how to use this driver 配置說明&#xff09; 對射式紅外傳感器 由一個紅外發光二極管和NPN光電三極管組成&#xff0c;M3固定安裝孔&#xff0c;有輸出狀態指示燈&#xff0c;輸出高電平燈滅&#xff0c;輸出…

https數字簽名手動驗簽

以bing.com 為例 1. CA 層級的基本概念 CA 層級是一種樹狀結構&#xff0c;由多個層級的 CA 組成。每個 CA 負責為其下一層級的實體&#xff08;如子 CA 或終端實體&#xff09;頒發證書。層級結構的頂端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整個 PKI 體…

【自然語言處理(NLP)】深度循環神經網絡(Deep Recurrent Neural Network,DRNN)原理和實現

文章目錄 介紹深度循環神經網絡&#xff08;DRNN&#xff09;原理和實現結構特點工作原理符號含義公式含義 應用領域優勢與挑戰DRNN 代碼實現 個人主頁&#xff1a;道友老李 歡迎加入社區&#xff1a;道友老李的學習社區 介紹 **自然語言處理&#xff08;Natural Language Pr…

Niagara學習筆記

橙色 發射器 , 綠色 粒子, 紅色 渲染器 Emitter State 發射器狀態 Life Cycle Mode&#xff08;生命周期模式&#xff09; 選擇Self就是發射器自身管理生命周期 Loop Behavior 決定粒子發射次數 一次&#xff08;Once&#xff09;&#xff1a;發射器只播放一次多次&#…