鏈表之第一回

在這里插入圖片描述

歡迎來到我的:世界

收錄專欄:鏈表

希望作者的文章對你有所幫助,有不足的地方還請指正,大家一起學習交流 !


目錄

  • 前言
    • 第一題:刪除鏈表的倒數第n個節點
    • 第二題:鏈表的中間結點
    • 第三題:合并兩個排序的鏈表
  • 總結

前言

  • 在這里寫的是有關鏈表的落坑題,詳細寫了我落坑的全過程,相信大家也都掉過坑,該專欄我會持續更新,感謝鐵子們的支持。
    -———————對過程全力以赴,對結果淡然處之

第一題:刪除鏈表的倒數第n個節點


地址: oj題地址


在這里插入圖片描述

解題思路:

  • 1.暴力遍歷:
    我們先遍歷一遍,找到該鏈表中有多少個節點(第一次遍歷),然后再第二次遍歷找到倒數第n個節點,再進行刪除,再返回原地址。這種方法可以說是這道題的比較簡單的實現方法。再這里我想講一下另一種方法:

  • 2.三指針法:
    先創造三個指針,tail指針,sur指針,dst指針,而sur,dst指針一開始指向是鏈表的起始地址,tail指針是指向sur指針前一個字節的地址,這就需要重新開辟一塊空間其中的next 可以找到sur的地址;
    起始時物理圖在這里插入圖片描述
    注意:鏈表因為地址不是相連的,其地址可以看作是隨機的,圖中的地址都是我隨便編的,只是為了方便更容易觀察

  • 思路:先讓dst指針向后走n個節點,這樣的話,dst指針和sur指針就相距了n個節點,然后讓這三個指針一起向后一次移動一個節點,直到dst指針指向空指針,這樣的話,sur所指的就是倒數第n個節點(這一步觀念很重要,一定要想清楚),這個時候有要刪除的那個節點地址,也有該節點上一個節點的地址tail指針所指,那就可以很好的完成刪除。
    以上的是思路,下面來進行實現

結束時的物理圖:
在這里插入圖片描述

struct ListNode* removeNthFromEnd(struct ListNode* head, int n ) {// write code here//sur指針是指向要刪除的那個節點,dst是與sur保持間距n的,tail是sur前一個節點struct ListNode* sur = head, *dst = head;struct ListNode*tail =(struct ListNode*)malloc(sizeof(struct ListNode));tail->next=sur;//先讓dst指針走n個節點while (n--) {dst = dst->next;}while (dst) {//三個指針一起出發,tail指針始終指向sur指針前前一個節點 dst = dst->next;sur = sur->next;tail = tail->next;}//刪除if (head == sur) {//如果sur沒動說明要刪的就在第一個head = head->next;sur = head->next;} else {//要刪的只要找到sur指針的前一個節點,就可以讓sur后一個節點與之相連tail->next = sur->next;}return head;
}

第二題:鏈表的中間結點


地址:oj地址


在這里插入圖片描述
解題思路:

  • 1.暴力遍歷法:
    根據這道題的正常思路,肯定是先遍歷一遍該鏈表的所有結點的個數,就可以得出中間點了,最后返回指向該點的地址;這種方法很尋常,在這里我就不具體講了,我想具體講下一種方法:
  • 2.快慢指針法:
    該方法思路是:先設置兩個指針:slow,fast,分別是快慢指針,首先兩個指針都是指向鏈表的起始位置,slow向下一個結點移動,而fast向下兩個結點移動,直到fast指針停下,那fast指針什么時候停呢,肯定有不同情況,如果鏈表的結點時偶數時,這時fast 走到空為止,而如果鏈表總結點時奇數時,這時fast走到尾結點停下。
    ----如為奇數時:邏輯圖:
    第一步:在這里插入圖片描述
    第二步:
    在這里插入圖片描述
    第三步
    在這里插入圖片描述

若為偶數時:
邏輯圖:
第一步:在這里插入圖片描述
第二步:
在這里插入圖片描述
第三步:
在這里插入圖片描述
第四步:
在這里插入圖片描述

代碼:

struct ListNode* middleNode(struct ListNode* head ) {// write code here//設置快慢指針struct ListNode*sur=head,*dst=head;//當dst指針為空或dst指向的next為空就停下while(dst && dst->next){sur=sur->next;dst=dst->next->next;}return sur;
}

第三題:合并兩個排序的鏈表


地址:oj地址


在這里插入圖片描述
解題思路:

首先鏈表和順序表不同,有些思路是行不通的;但也有其優點,鏈表是由一個一個結點連起來的,可以隨時拆下來的;
用歸并的方法,我們可以先創造兩個指針,讓需要歸并的兩組鏈表由起始位置進行比較,較小值尾插入一個指針,另一個指針是找到需要插入的前一個結點,好方便尾插;
在這里插入圖片描述
比較1<2,尾插入 1 ,如果是第一次插入,應該先讓head指針和tail指針同時指向 1 的地址;如果不是第一次插入,那就是應該pHead1的地址給tail->next,然后讓tail指針指向tail->next,最后讓pHead1指向下一個結點;
在這里插入圖片描述

  • 然后是 2<3 ,尾插入2的地址;跟上面的步驟一樣;
    注意:這里之后就不是第一次插入,記得讓tail指針指向tail的下一個結點;

    在這里插入圖片描述
    后面的步驟幾乎是一樣的;
    直到有一個鏈表沒有了,在將剩下鏈表直接進行尾插入,就可以了;
    在這里插入圖片描述
    在這里插入圖片描述
    最后返回head指針;
    但是這就對了么?
    不是的,還有一步我們忘記了,如果兩個鏈表其中一個是空,那這個程序的結果肯定報錯,所以我們還要在最開始進行判斷,如果有其中一個為空,則直接返回另一個鏈表;

代碼:

struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {// write code here//如果其中一個鏈表為空,則直接返回另一個鏈表if(pHead1==NULL)return pHead2;if(pHead2==NULL)return pHead1;struct ListNode* head = NULL, *tail = NULL;//判斷哪個鏈表先為空,就跳出去while (pHead1 && pHead2) {if (pHead1->val < pHead2->val) {if (tail == NULL) {//第一次尾插head = tail = pHead1;} else {//不是第一次尾插tail->next = pHead1;tail=tail->next;}//讓篇pHead1指針找到下一個結點pHead1 = pHead1->next;} else {if (tail == NULL) {//第一次尾插head = tail = pHead2;} else {//不是第一次尾插tail->next = pHead2;tail=tail->next;}//讓篇pHead2指針找到下一個結點pHead2 = pHead2->next;}}//判斷哪個鏈表先為空,然后讓另一個鏈表直接尾插入;
if(pHead1)tail->next=pHead1;if(pHead2)tail->next=pHead2;return head;
}

總結

在這里感謝老鐵們的觀看,在這里小孩謝謝大家的支持,以上的題目都是基于小孩現在的能力來說,如果還有更好的方法的老鐵,可以在評論區里面一起進行討論哦,在后面隨著小孩的知識儲備越多,小孩肯定還會加以優化優化!!


到了最后:
我還想告訴你:
------------對過程全力以赴,對結果淡然處之
也是對我自己講的

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

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

相關文章

如何在 iOS 上安裝并使用 ONLYOFFICE 文檔

借助 iOS 版文檔應用&#xff0c;您可在移動端設備上訪問存儲于 ONLYOFFICE 賬戶中的文件&#xff0c;查看和編輯現有文本文檔、電子表格和演示文稿&#xff0c;創建新文檔并對其進行整理&#xff0c;以及連接第三方云存儲服務。您可與其他門戶網站用戶協作編輯文檔&#xff0c…

數據結構-棧和隊列

目錄 棧的概念 棧的使用 ?編輯 模擬實現棧 中綴表達式轉后綴表達式 括號匹配 出棧入棧次序匹配 隊列概念 隊列的使用 棧的概念 棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行數據插入和刪除操作的一端稱為棧頂,;另一端稱為棧底.棧中的數據…

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

面試攻略,Java 基礎面試 100 問(十五)

final, finally, finalize 的區別? final&#xff1a;修飾符&#xff08;關鍵字&#xff09;有三種用法&#xff1a;如果一個類被聲明為 final&#xff0c;意味著它不能再派生出新的子類&#xff0c;即不能被繼承&#xff0c;因此它和 abstract 是反義詞。將變量聲明為 final…

動手學DL——MLP多層感知機【深度學習】【PyTorch】

文章目錄 4、多層感知機&#xff08; MLP&#xff09;4.1、多層感知機4.1.1、隱層4.1.2、激活函數 σ 4.2、從零實現多層感知機4.3、簡單實現多層感知機4.4、模型選擇、欠擬合、過擬合4.5、權重衰退4.6、丟失法|暫退法&#xff08;Dropout&#xff09;4.6.1、dropout 函數實現4…

大數據--難點--地圖的制作

地圖一直是亮點也是難點&#xff0c;剛剛進公司的時候也很難懂~~做出來的也很難看 純CSS3使用vw和vh視口單位實現h5頁面自適應&#xff0c;gulp自動監聽sass改動并保存到css中 當修改了sass里面的代碼后&#xff0c;gulp會自動監聽修改內容并同名保存到css文件夾中&#xff0…

C#字符串占位符替換

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}歲&#xff0c;身高{2}cm&#xff0c;月收入{3}元&#xff1b;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

02-C++數據類型-高級

數據類型-高級 4、復合類型 4.4、結構簡介 struct inflatable {char name[20];float vol;double price; };inflatable vincent; //C struct inflatable goose; //C例子 // structur.cpp -- a simple structure #include <iostream> struct inflatable // structu…

B057-spring增強 依賴注入 AOP 代理模式 創建Bean

目錄 AOP概念代理模式引出AOP實現方式xml方式實現注解方式實現 AOP 概念 事務管理&#xff1a;比如可以抽取try catch的重復代碼 日志監控&#xff1a;比如業務邏輯前后打印關于當前訂單數量的日志&#xff0c;了解業務做了什么 性能監控&#xff1a;比如業務前后打印時間&…

浪潮信息趙帥:多元算力時代 開源開放的OpenBMC成為服務器管理優先解

“多元算力時代下&#xff0c;大規模的異構服務器設備面臨多種處理器架構、多種設備協議、不同管理芯片兼容的系統化設計挑戰&#xff0c;管理固件也迎來新的變革。開源開放的OpenBMC&#xff0c;以創新的分層解耦軟件架構&#xff0c;兼容不同處理器架構、算力平臺和管理芯片&…

人流目標跟蹤pyqt界面_v5_deepsort

直接上效果圖 代碼倉庫和視頻演示b站視頻006期&#xff1a; 到此一游7758258的個人空間-到此一游7758258個人主頁-嗶哩嗶哩視頻 代碼展示&#xff1a; YOLOv5 DeepSORT介紹 YOLOv5 DeepSORT是一個結合了YOLOv5和DeepSORT算法的目標檢測與多目標跟蹤系統。讓我為您詳細解釋一…

【字典學習+稀疏編碼Sparse Encoding】簡單介紹與sklearn的實現方式

文章目錄 1、字典學習與稀疏編碼2、sklearn的實現3、示例 1、字典學習與稀疏編碼 簡單來說&#xff0c;稀疏編碼就是把輸入向量&#xff08;信號&#xff09;/ 矩陣&#xff08;圖像&#xff09;表示為稀疏的系數向量和一組超完備基向量&#xff08;字典&#xff09;的線性組合…

vim打開文件中文是亂碼

vim打開文件中文是亂碼 問題&#xff1a;在Linux系統下&#xff0c;使用cat查看含有中文的文本文件正常&#xff0c;但是使用vim打開卻是亂碼 解決方法&#xff1a; 方法一&#xff1a; 在文件中設定 在vim的退出模式下 :set encodingutf8 方法二&#xff1a; 直接寫入/etc/…

ASP.NET WEB API通過SugarSql連接MySQL數據庫

注意&#xff1a;VS2022企業版可以&#xff0c;社區版可能存在問題。實體名稱和字段和數據庫中的要一致。 1、創建項目&#xff0c;安裝SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件結構 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

Ubuntu 軟件依賴出錯處理

現象&#xff1a; apt-get install vim 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 您可能需要運行“apt-get -f install”來糾正下列錯誤&#xff1a; 下列軟件包有未滿足的依賴關系&#xff1a; cuttlefish-base : 依賴: f2fs-tools…

DG故障切換及DG Broker失效配置清理

DG故障切換及DG Broker失效配置清理 DG故障強制切主DG Broker原有配置清理 DG故障強制切主 主庫發生故障無法在短時間內恢復時&#xff0c;需要執行主備切換。此時由于DG Broker無法連接到主庫&#xff0c;故不能通過Broker切換&#xff0c;只能手動在備庫進行切主。 --斷開備…

Neo4j之MERGE基礎

在 Neo4j 中&#xff0c;MERGE 語句用于根據指定的模式進行創建或匹配節點和關系。它可以在節點或關系不存在時創建它們&#xff0c;并在已存在時進行匹配。 創建或匹配節點&#xff1a; MERGE (p:Person {name: John});這個查詢會檢查是否已經存在一個具有 "Person&quo…

搭建WebDAV服務手機ES文件瀏覽器遠程訪問

文章目錄 1. 安裝啟用WebDAV2. 安裝cpolar3. 配置公網訪問地址4. 公網測試連接5. 固定連接公網地址6. 使用固定地址測試連接 有時候我們想通過移動設備訪問群暉NAS 中的文件,以滿足特殊需求,我們在群輝中開啟WebDav服務,結合cpolar內網工具生成的公網地址,通過移動客戶端ES文件…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-排序模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述&#xff1a;分析代碼排序模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三…

docker通用鏡像方法,程序更新時不用重新構建鏡像

docker通用鏡像方法&#xff0c;程序更新時不用重新構建鏡像。更新可執行文件后&#xff0c;重新啟動容器就可運行。 功能 1、在demo目錄下添加腳本文件start.sh&#xff0c;里面執行demo.jar文件。 2、將demo目錄映射到鏡像下的 /workspace目錄。 3、Dockerfile文件中默認…