【算法集訓】基礎數據結構:三、鏈表

鏈表就是將所有數據都用一個鏈子串起來,其中鏈表也有多種形式,包含單向鏈表、雙向鏈表等;
現在畢竟還是基礎階段,就先學習單鏈表吧;
鏈表用頭結點head表示一整個鏈表,每個鏈表的節點包含當前節點的值val和下一個節點next
鏈表的好處就是刪除和插入比較容易,不需要移動其他元素。只需要改變下一個節點的指向值即可。

第一題 面試題 02.02. 返回倒數第 k 個節點

https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/
返回第k個節點的值,這里使用雙指針的思路,定義一個快指針和慢指針,兩個指針之間間隔k位,快指針移動到最后一個節點的下一個節點(即節點為空時)時就停止,此時慢指針對應的就是倒數第k個節點值。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k){struct ListNode * fast = head;struct ListNode * slow = head;for(int i = 0; i < k; ++i) {fast = fast->next;}while(fast) {fast = fast->next;slow = slow->next;}return slow->val;
}

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

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
刪除倒數第n個節點,思路和上一題一樣,先找到倒數第N個節點,我們要刪除這個節點,所以需要找到這個節點的前一個節點N+1
直接將下一個值指向N的下一個值即可。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode * fast = head;struct ListNode * slow = head;for(int i = 0; i < n; ++i) {fast = fast->next;if(fast == NULL) {return head->next;}}fast = fast->next;while(fast) {fast = fast->next;slow = slow->next;}slow->next = slow->next->next;return head;}

第三題 206. 反轉鏈表

https://leetcode.cn/problems/reverse-linked-list/description/

第一種:迭代方法,定義一個當前節點cur和前一個節點pre,遍歷鏈表,將指向換一下方向即可,注意保存cur->next

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* reverseList(struct ListNode* head) {struct ListNode * pre = NULL;struct ListNode * cur = head;while(cur) {struct ListNode * temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;
}

第二種:遞歸
主要思想就是從最后一個開始,將它的指針指向前一個節點,然后前一個節點指向NULL;
這時又遞歸到前一個節點,和上面操作一樣,一直到第一個頭結點,這時頭結點會置為NULL;

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode * doReverse(struct ListNode * head, struct ListNode ** outHead) {遞歸臨界點,如果到最后一個節點則開始往回走;if(head == NULL || head->next == NULL) {*outHead = head;  outhead是最終翻轉后的頭結點,所以這里head最后一個節點就是outhead的頭結點return head;}
每次遞歸都向下一層,返回值為反轉后的struct ListNode * tail = doReverse(head->next, outHead);tail->next = head;head->next = NULL;return head;
}struct ListNode* reverseList(struct ListNode* head) {struct ListNode * outHead;doReverse(head, &outHead);return outHead;
}

第四題 237. 刪除鏈表中的節點

https://leetcode.cn/problems/delete-node-in-a-linked-list/description/
這道題代碼不難,主要的是思想,能不能想到這樣的方法。
只給了一個需要刪除的節點node,讓你刪除這個節點。
那么我們只需要將node->next的值賦值給node,那么這樣就可以刪除node->next,這樣同樣可以達到需要的結果。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
void deleteNode(struct ListNode* node) {node->val = node->next->val;node->next = node->next->next;
}

第五題 24. 兩兩交換鏈表中的節點

https://leetcode.cn/problems/swap-nodes-in-pairs/description/
本題有兩種做法,迭代和遞歸,遞歸相對來說難理解。
一、遞歸

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* swapPairs(struct ListNode* head) {定義臨界點,即遞到最后一個節點或者空時開始歸。if(head == NULL || head->next == NULL) {return head;}這里就是記錄遞歸的當前節點和下一個節點,用于后續交換struct ListNode* now = head;struct ListNode* next = head->next;這里記錄的是后面已經完成交換的頭結點nextnext;struct ListNode* nextnext = swapPairs(now->next->next);這里算是核心,now->next = nextnext;  每次將當前節點的下個節點指向已經完成交換的頭結點next->next = now;  將當前節點下一個節點又指向當前節點,即完成本輪交換return next;
}

二、迭代

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode * virhead = new ListNode();virhead->next = head;ListNode * cur = virhead;while (cur->next != nullptr && cur->next->next != nullptr) {ListNode * temp1 = cur->next;ListNode * temp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp1;cur->next->next->next = temp2;cur = cur->next->next;}return virhead->next;}
};

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

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

相關文章

2024 年頂級的 Android 系統修復軟件與方法

您是否正在尋找可以修復 PC 上 Android 操作系統的工具&#xff1f;這是我們精選的最好的 Android 系統修復軟件&#xff01; Android 是世界著名的智能手機操作系統。全世界有數百萬人使用這個操作系統&#xff0c;這使得它安全可靠。然而&#xff0c;這仍然不能使它完美無缺…

048:利用vue-video-player播放m3u8

第048個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

普冉(PUYA)單片機開發筆記(6): 呼吸燈

概述 上一篇的實驗中&#xff0c;分別正確地配置了 TIM16 和 TIM1&#xff0c;TIM16 的中斷服務程序中每隔 500ms 翻轉板載 LED 一次&#xff1b;TIM1 的 CHANNEL_1 用于輸出一個固定占空比的 PWM 信號。這一次我們進一小步&#xff1a;使用 TIM16 的中斷設置 TIM1 CHANNEL_1 …

MyBatis進階之分頁和延遲加載

文章目錄 分頁1. RowBounds 分頁2. PageHelper 分頁3. PageInfo 對象屬性描述 延遲加載立即加載激進式延遲加載真-延遲加載 分頁 Mybatis 中實現分頁功能有 3 種途徑&#xff1a; RowBounds 分頁&#xff08;不建議使用&#xff09;Example 分頁&#xff08;簡單情況可用)Pag…

關于對向量檢索研究的一些學習資料整理

官方學習資料 主要是的學習資料是&#xff0c; 官方文檔 和官方博客。相關文章還是挺多 挺不錯的 他們更新也比較及時。有最新的東西 都會更新出來。es scdn官方博客 這里簡單列一些&#xff0c;還有一些其他的&#xff0c;大家自己感興趣去看。 什么是向量數據庫 Elasticse…

文件加密軟件哪個最好用 好用的文件加密軟件推薦

一說到文件加密軟件&#xff0c;可能大家都會去搜一些不知名的軟件來&#xff0c;但是選擇這種加密軟件&#xff0c;最好還是要看一些資質的。 資質不好的&#xff0c;可能加密過后你自己也打不開文件&#xff0c;&#xff08;ps&#xff1a;我自己就遇到過這種情況&#xff09…

【華為OD機試python】分蘋果【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 A、B兩個人把蘋果分為兩堆,A希望按照他的計算規則等分蘋果, 他的計算規則是按照二進制加法計算,并且不計算進位 12+5=9(1100 + 0101 = 9), B的計算規則是十進制加法,包括正常進位,…

基于Java SSM框架高校校園點餐訂餐系統項目【項目源碼+論文說明】計算機畢業設計

基于java的SSM框架高校校園點餐訂餐系統演示 摘要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人們所認識&a…

(一)Java 基礎語法

目錄 一. 前言 二. Hello World 三. Java 語法 3.1. 基本語法 3.2. Java 標識符 3.3. Java 修飾符 3.4. Java 變量 3.5. Java 數組 3.6. Java 枚舉 3.7. Java 關鍵字 3.8. Java 注釋 3.9. Java 空行 3.10. Java 繼承 3.11. Java 接口&#xff08;interface&#…

Oracle(2-14)User-Managed Incomplete Recovery

文章目錄 一、基礎知識1、Incomplete Recovery Overview 不完全恢復概述2、Situations Requiring IR 需要不完全恢復的情況3、Types of IR 不完全恢復的類型4、IR Guidelines 不完全恢復指南5、User-Managed Procedures 用戶管理程序6、RECOVER Command Overview 恢復命令概述7…

算法訓練營Day8(字符串)

344.反轉字符串 344. 反轉字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public void reverseString(char[] s) {for(int i 0,j s.length-1;i< s.length/2 ; i,j--){swap(s,i,j);}}public void swap(char[] s,int i,int j ){char temp s[i];s[i] s[j]…

Python數據科學視頻講解:Python注釋

2.3 Python注釋 視頻為《Python數據科學應用從入門到精通》張甜 楊維忠 清華大學出版社一書的隨書贈送視頻講解2.3節內容。本書已正式出版上市&#xff0c;當當、京東、淘寶等平臺熱銷中&#xff0c;搜索書名即可。內容涵蓋數據科學應用的全流程&#xff0c;包括數據科學應用和…

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK 2023/12/10 17:27 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ mkdir nanopc-t4 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ cd nanopc-t4/ …

python4E 之 Dict 找到兩個不同索引但都需要對應的值。

找到兩個不同索引但都需要&#xff0c;對應的值。 df pd.DataFrame(np.random.randint(1, 10, [3,3]), columns list(ABC)) 通過 dict 制造key index_htable{} for _,row in idc.iterrows(): #按行循環 key str(row[u股票代碼]) | str(row[u日期]) #根據不同 的索引…

45.0/HTML 簡介(詳細版)

目錄 45.1 互聯網簡介 45.2 網頁技術與分類 45.3 HTML 簡介 45.3.1 什么是 HTML?(面試題) 45.3.2 HTML 文件結構 45.3.3 HTML 語法 45.3.4 實例演練步驟(面試題) 45.4 head 中的常用標簽 45.4.1 title 標記 45.4.2 meta 標記 45.4.3 45.4.4 45.4.4(面試題)總結: 45…

【AIE】AIE微信合集

AIE微信合集 AIE(1) 對于Versal&#xff0c;我們從系統角度看&#xff0c;可將其分為3個Domain&#xff1a;AIE、PS和PL&#xff0c;如下圖所示。如果要運行一個AIE的應用&#xff0c;絕大多數情況下&#xff0c;這3個Domain我們都會用到&#xff0c;使其協同工作。這里我們僅…

linux less命令(less指令)(查看開頭、從開頭查看、從起始查看、反向導航、反向查找)

文章目錄 Linux Less 命令1. Less 命令簡介2. 基礎用法less filename<command> | less 3. 常用命令行選項4. 高級技巧和用法4.1 搜索內容4.2 標記和跳轉4.3 查看多個文件 5. less命令使用文檔6. 總結 Linux Less 命令 less 是一種在Linux環境中查看文件內容的工具&#…

《絕地求生》新手怎么玩 游戲基本介紹

隨著電競熱潮的興起&#xff0c;《絕地求生》已經成為了一款備受玩家熱愛的游戲。這款游戲在全球范圍內擁有龐大的玩家群體&#xff0c;它將你置身于一個荒無人煙的島嶼上&#xff0c;與其他99名玩家展開生死競爭。作為一個新手&#xff0c;下面閑游盒小盒子就為大家詳細介紹一…

Ubuntu20.04創建并掛在zfs池

Ubuntu 下使用 ZFS [適用于中高級用戶] 主磁盤上清潔安裝帶有ZFS的Ubuntu后&#xff0c;可以開始體驗其特性。 所有ZFS配置過程都需要命令行。 我不知道有GUI工具。 創建一個 ZFS 池 本節僅適用于具有多個磁盤的系統。 如果只有一個磁盤&#xff0c;Ubuntu會在安裝時自動創建…

寫實3D游戲模型紋理貼圖設置

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xff1a; …