鏈表-算法小結

鏈表

單鏈表 雙鏈表 循環鏈表
鏈表_stl-CSDN博客

虛擬頭結點
反轉鏈表

刪除鏈表元素

方法一: 直接使用原來的鏈表來進行刪除操作。

  • 頭節點是否為空
  • 頭鏈表的值是否為要刪除的值
  • 頭結點刪除后,新的頭節點是否依舊要刪除 ,刪除后的,新頭節點可能是空結點

方法二: 設置一個虛擬頭結點在進行刪除操作。

  ListNode* dummyHead = new ListNode(0); // 設置一個虛擬頭結點dummyHead->next = head; // 將虛擬頭結點指向head,這樣方便后面做刪除操作ListNode* cur = dummyHead;while (cur->next != NULL) {if(cur->next->val == val) {ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;} else {cur = cur->next;}}head = dummyHead->next;delete dummyHead;return head;}

在這里插入圖片描述
設置一個虛擬頭結點,這樣原鏈表的所有節點就都可以按照統一的方式進行移除

203. 移除鏈表元素 - 力扣(LeetCode)
// 危險操作!
1.直接操作原始頭指針
2.造成空指針解引用 (先訪問head->val會觸發尸變)
3.需要確保在刪除節點后立即更新指針,避免懸空指針的使用

反轉鏈表

206. 反轉鏈表 - 力扣(LeetCode)

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode*cur=head;ListNode*pre=nullptr;ListNode*next;while(cur){next=cur->next;cur->next=pre;pre=cur;cur=next;}return pre;}
};

在這里插入圖片描述

遞歸
( 從后往前翻轉指針指向 )

    ListNode* reverseList(ListNode* head) {// 遞歸終止條件if (!head || !head->next) {return head;}ListNode* reversedHead = reverseList(head->next);head->next->next = head;head->next = nullptr;return reversedHead;}

快慢指針 刪除鏈表的倒數第N個節點

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

為什么是n+1呢,因為只有這樣同時移動的時候slow才能指向刪除節點的上一個節點(方便做刪除操作)

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode*dummy=new ListNode(0);dummy->next=head;ListNode*fast=dummy;ListNode*slow=dummy;for(int i=0;i<n+1;i++){fast=fast->next;}while(fast){slow=slow->next;fast=fast->next;}ListNode*temp=slow->next;slow->next=temp->next;delete temp;return dummy->next;}
};

19. 刪除鏈表的倒數第 N 個結點 - 力扣(LeetCode)

鏈表相交

簡單來說,就是求兩個鏈表交點節點的指針

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode*currentA=headA;ListNode*currentB=headB;int lenA=0,lenB=0;while(currentA){currentA=currentA->next;lenA++;}while(currentB){currentB=currentB->next;lenB++;}currentA=headA;currentB=headB;if(lenA>lenB){int len=lenA-lenB;while(len--){currentA=currentA->next;}}if(lenA<lenB){int len=lenB-lenA;while(len--){currentB=currentB->next;}}while(currentA!=currentB){currentB=currentB->next; currentA=currentA->next;}return currentA;}
};

面試題 02.07. 鏈表相交 - 力扣(LeetCode)

環形鏈表II

fast走兩步,slow走一步,相對于slow來說,fast是一個節點一個節點的靠近slow的,所以fast一定可以和slow重合

在相遇節點處,定義一個指針index1,在頭結點處定一個指針index2。
讓index1和index2同時移動,每次移動一個節點, 那么他們相遇的地方就是 環形入口的節點
(x + y) * 2 = x + y + n (y + z)
x + y = n (y + z)
x = n (y + z) - y
x = (n - 1) (y + z) + z
當 n為1的時候,公式就化解為 x = z

這就意味著,從頭結點出發一個指針,從相遇節點 也出發一個指針,這兩個指針每次只走一個節點, 那么當這兩個指針相遇的時候就是 環形入口的節點

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode*show=head;ListNode*fast=head;while(fast != NULL && fast->next != NULL){show=show->next;for(int i=0;i<2;i++)fast=fast->next;if(show==fast){ListNode*index1=head;ListNode*index2=fast;while(index1!=index2){index1=index1->next;index2=index2->next;}return index1;}}return nullptr;}
};

142. 環形鏈表 II - 力扣(LeetCode)

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

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

相關文章

C語言中常用的調試宏和函數總結(__LINE__、__FUNCTION__)

表格&#xff1a;C語言調試工具 類別工具描述示例代碼預定義宏__LINE__表示當前源代碼的行號。printf("Error occurred at line %d\n", __LINE__);__FILE__表示當前源代碼文件的名稱。printf("Error occurred in file %s\n", __FILE__);__func__表示當前函…

DotnetCore開源庫SampleAdmin源碼編譯

1.報錯: System.Net.Sockets.SocketException HResult0x80004005 Message由于目標計算機積極拒絕&#xff0c;無法連接。 SourceSystem.Net.Sockets StackTrace: 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, C…

如何使用切片操作來處理序列數據

1 問題 本文主要探究 Python 中切片操作的原理和應用。具體來說&#xff0c;我們將分析切片的基本語法、切片的步長和切片的邊界&#xff0c;并通過示例代碼展示如何使用切片操作來處理序列數據。 2 方法 為了更好地理解切片操作&#xff0c;我們采用如下的思路學習python中的切…

java(二):java的運算和流程控制

java中單引號和雙引號區別和用法 區別1&#xff1a;java中的單引號表示字符&#xff0c;雙引號表示字符串。 區別2&#xff1a;單引號引的數據一般是char類型的&#xff1b;雙引號引的數據 是String類型的。 區別3&#xff1a;java中單引號里面只能放一個字母或數字或符號&…

Android envsetup與Python venv使用指南

Android envsetup 和 Python venv 是兩種完全不同的環境配置工具&#xff0c;分別服務于不同的開發場景。以下是對它們的詳細解釋及使用方法&#xff1a; 1. Android envsetup 用途&#xff1a; Android envsetup 是 Android 源碼開發中的環境配置腳本&#xff08;envsetup.sh…

游戲引擎學習第222天

回顧昨天的過場動畫工作 我們正在制作一個游戲&#xff0c;目標是通過直播的方式完成整個游戲的開發。在昨天的工作中&#xff0c;我享受了制作過場動畫的過程&#xff0c;所以今天我決定繼續制作多個層次的過場動畫。 昨天我們已經開始了多層次過場動畫的基本制作&#xff0…

Leedcode刷題 | Day31_貪心算法05

一、學習任務 56. 合并區間代碼隨想錄738. 單調遞增的數字968. 監控二叉樹 二、具體題目 1.56合并區間56. 合并區間 - 力扣&#xff08;LeetCode&#xff09; 給出一個區間的集合&#xff0c;請合并所有重疊的區間。 示例 1: 輸入: intervals [[1,3],[2,6],[8,10],[15,1…

app逆向專題五:新快報app數據采集

app逆向專題五:新快報app數據采集 一、抓包尋找數據接口二、編寫代碼三、完整代碼一、抓包尋找數據接口 打開charles,并在手機端打開新快報app,點擊“廣州”或者“經濟”等選項卡,抓包,尋找數據接口,如圖所示: 二、編寫代碼 這里介紹一種簡便的代碼編寫方法,在數據…

Java面試黃金寶典45

1. 非對稱加密 RSA 定義:RSA 是一種廣泛使用的非對稱加密算法,其安全性基于大整數分解的困難性。它使用一對密鑰,即公鑰和私鑰。公鑰可公開用于加密消息,而私鑰必須保密,用于解密由相應公鑰加密的消息。要點: 公鑰公開,私鑰保密,二者成對出現。加密和解密使用不同的密鑰…

提權實戰!

就是提升權限&#xff0c;當我們拿到一個shell權限較低&#xff0c;當滿足MySQL提權的要求時&#xff0c;就可以進行這個提權。 MySQL數據庫提權&#xff08;Privilege Escalation&#xff09;是指攻擊者通過技術手段&#xff0c;從低權限的數據庫用戶提升到更高權限&#xff…

在虛擬機上修改saprk的版本

之前安裝的spark版本是3.4&#xff0c;現在實驗需要的版本是2.4。現在需要更改spark的版本。 方法很簡單&#xff1a; 直接將原有的spark3.4的文件刪除&#xff0c;再安裝2.4版本。 安裝過程之后再寫。Spark2.1.0入門&#xff1a;Spark的安裝和使用_廈大數據庫實驗室博客

文獻分享: DESSERT基于LSH的多向量檢索(Part3.2.外部聚合的聯合界)

原論文 文章目錄 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \textbf{1.1. } 1.1. 一些符號 1.2. \textbf{1.2. } 1.2. 定理內容 3. \textbf{3. } 3. 聯合界限 Ps. \textbf{Ps. } Ps. 運行時間分析 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的內容 1.1. \t…

MIPI協議介紹

MIPI協議介紹 mipi 協議分為 CSI 和DSI,兩者的區別在于 CSI用于接收sensor數據流 DSI用于連接顯示屏 csi分類 csi 分為 csi2 和 csi3 csi2根據物理層分為 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的區別 d-phy的時鐘線和數據線是分開的,2根線一對…

【中間件】nginx反向代理實操

一、說明 nginx用于做反向代理&#xff0c;其目標是將瀏覽器中的請求進行轉發&#xff0c;應用場景如下&#xff1a; 說明&#xff1a; 1、用戶在瀏覽器中發送請求 2、nginx監聽到瀏覽器中的請求時&#xff0c;將該請求轉發到網關 3、網關再將請求轉發至對應服務 二、具體操作…

在3ds Max中視口顯示為黑色或深灰色

在3ds Max中視口顯示為黑色或深灰色 Autodesk Support 2023年10月8日 涵蓋的產品和版本 問題&#xff1a; 在3ds Max中&#xff0c;使用“深”UI方案時視口顯示為完全黑色&#xff0c;使用“淺”UI方案時視口顯示為深灰色。 原因&#xff1a; 已為用戶界面禁用Gamma校正。…

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的開發過程中&#xff0c;條件渲染是一項極為常見的需求。v-if指令作為 Vue.js 實現條件渲染的關鍵手段&#xff0c;能夠根據表達式的真假來決定是否渲染某一塊 DOM 元素。它在優化頁面展示邏輯、提升用戶體驗等方面發揮著重要作用。接下來&#xff0c;我們就深入探討…

Verilog:LED呼吸燈

模塊接口說明 信號方向描述clk輸入系統時鐘&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n輸入低電平有效的異步復位信號led_en輸入總使能信號&#xff08;1開啟呼吸燈&#xff0c;0關閉&#xff09;speed_en輸入呼吸速度調節使能信號speed[2:0]輸入呼吸速度分級&a…

我的計算機網絡(總覽篇)

總覽--網絡協議的角度 在一個龐大的網絡中&#xff0c;該從哪里去了解呢&#xff1f;我先細細的講一下我們訪問一個網站的全部流程&#xff0c;當我們的電腦連上網絡的時候&#xff0c;就會啟動DHCP協議&#xff0c;來進行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

開源的PMPI庫實現及示例代碼

開源的PMPI庫實現及示例代碼 PMPI (Profiling MPI) 是MPI標準中定義的接口&#xff0c;允許開發者通過攔截MPI調用進行性能測量和調試。以下是幾個常用的開源PMPI庫實現&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追蹤慣性系統

今天做項目適合 策劃想要實現一個在現有的怪物追蹤系統上實現怪物擁有慣性功能 以下是解決方案分享&#xff1a; 怪物基類代碼&#xff1a; ? using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …