數據結構之加餐篇 -順序表和鏈表加餐

目錄

  • 一、鏈表分割
  • 二、隨機鏈表的復制
  • 總結


一、鏈表分割

鏈表分割
在這里插入圖片描述
題目描述的意思就如下圖:
在這里插入圖片描述
也就是把1,2挪到前面,6,3,5挪到后面,前者的相對順序不發生改變

這里要想往后挪就要先遍歷,遍歷到6比3小,這里要通過刪除6這個節點然后尾插到后面來實現嗎?這樣就太麻煩了

思路:創建兩個非空鏈表(小鏈表,大鏈表),遍歷原鏈表,小的尾插到小鏈表中,大的尾插到大鏈表中(簡單的將節點分為小于x的節點和大于等于x的節點),最終大鏈表和小鏈表首尾相連
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
注意:這里第一個參數是鏈表,所以我們就加一個大括號,然后節點之間用逗號分隔,兩個參數之間也要用逗號分隔
在這里插入圖片描述
這串代碼看似沒有問題
在這里插入圖片描述
然而提交出現了錯誤,出現內存超限的原因有兩種,第一種是陷入死循環,第二種是無限遞歸(無線創建函數棧幀),首先排除死循環,因為自測結果沒有出錯,那么就是節點出現問題了
這里改一下節點順序
在這里插入圖片描述
在這里插入圖片描述
發現出現死循環,1,2,5,3,6打印完之后又從2開始打印,6拿過來尾插之后,其的next指針沒有發生改變,還是指向2這個節點
在這里插入圖片描述
解決方法很簡單,讓大鏈表的尾節點置為空就好
在這里插入圖片描述


二、隨機鏈表的復制

隨機鏈表的復制
在這里插入圖片描述
補充一下題目中所說的深/淺拷貝是什么意思
淺拷貝:就是值拷貝
在這里插入圖片描述
如圖將pcur指向節點3進行淺拷貝,只需要讓新的指針指向3即可
如果是深拷貝就要向操作系統額外申請一個節點大小的空間
在這里插入圖片描述
乍一看這個題很簡單
在這里插入圖片描述
這里定義pcur來遍歷原鏈表,只要節點不為空,就復制該節點
首先向操作系統malloc一塊一摸一樣節點大小的空間
在這里插入圖片描述
新的節點的值和原節點相等,next和random的值初始情況下置為空,接下來pcur往后走,只要節點不為空,就把13這個節點拿到復制鏈表進行尾插,新節點的13(next,random都默認為空),新節點7的next指針指向13
在這里插入圖片描述
依次類推
在這里插入圖片描述
但是尾插的時候只能設置當前節點里的值和next指針,這個random指針怎么做呢?
如果我再讓pcur回到第一個節點,發現原鏈表的random指針置為空,便讓新鏈表的random指針置為空
在這里插入圖片描述
還需要定義一個指針遍歷新的鏈表,也就是操作完一個節點pcur和copy都要往后走,但是發現13的random指針指向前一個節點,單鏈表又是單向的,這里是頭節點
在這里插入圖片描述
如果10的random節點指向13,這就不好找了,又要從頭向后遍歷

新的思路:(1)就是在原鏈表的基礎上拷貝節點

在這里插入圖片描述
從頭開始遍歷,遍歷到7,創建一個和7一摸一樣的節點(malloc),然后讓newnode尾插到pcur節點之后,newndoe的next指針指向pcur的下一個節點,pcur的下一個節點用next保存

尾插之后pcur指向其原來指向的next節點,只要13這個節點不為空,再深拷貝一個13節點,然后把新的節點拿到13節點之后尾插,然后pcur->next指針指向newnode,newnode->next指針指向next節點,以此類推,循環往復
在這里插入圖片描述
pcur跳出循環,不能對空節點進行深拷貝

(2)設置random指針

在這里插入圖片描述
這里原鏈表中7的random指針置為空,那么復制節點的ramdom也置為空,然后copy往后走,cur也往后走(這里cur原來是在原節點7的位置)
原鏈表13的random指針是7,那么copy節點的random指針滿足下面的條件,當原鏈表里的random指針不為空,就滿足這樣一個規則
在這里插入圖片描述
cur->random指針指向7,其的next節點就是復制節點的random指針指向的節點

此時copy和cur都往后走,以此類推,循環往復
在這里插入圖片描述
此時只要cur的random指針不為空,就可以執行該規則
在這里插入圖片描述
在這里插入圖片描述
當cur為空,拷貝節點的random指針都設置完了

(3)斷開新舊鏈表

在這里插入圖片描述
這里斷開可以讓拷貝節點指向其下一個節點,原鏈表的next指針其實不用管,雖然原鏈表的next指針指向新鏈表,但是并不影響新鏈表,新鏈表連到一起打印的時候,并不會打印到原鏈表里面

所以這里新舊鏈表的斷開可以讓新鏈表的next指針指向自己的節點,也可以讓原鏈表的next指針也指向自己的節點,改不改都不影響,這里我就不管了,只要新鏈表是獨立的鏈表就好了

這里拷貝鏈表的頭和尾初始情況下指向pcur的下一個節點,只要copyTail的下一個節點不為空,就意味著pcur的下一個節點非空,讓pcur走到復制節點尾節點的下一個節點,再讓復制節點7的next指針不再指向原節點13,而是指向pcur的下一個節點,此時pcur的下一個節點就是新節點13,此時13稱為拷貝鏈表的新的尾節點,這里要兩張圖結合來看
在這里插入圖片描述
以此類推,循環往復
在這里插入圖片描述
這里只要copyTail的下一個節點不為空,這里pcur可以走到copyTail的下一個節點,再讓copyTail->next指針指向pcur的下一個節點
在這里插入圖片描述
然后1變為新的尾節點,這里copyTail的下一個節點為空了,此時就把舊鏈表從新鏈表里面斷開了。

直接返回拷貝后鏈表的頭節點就好了

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/typedef struct Node Node;//創建新節點Node* buyNode(int x){Node* newnode=(Node*)malloc(sizeof(Node));newnode->val=x;newnode->next=newnode->random=NULL;return newnode;}//在原鏈表的基礎上拷貝節點插入原鏈表中
void AddNode(Node* head)
{Node* pcur=head;while(pcur){Node* newnode=buyNode(pcur->val);Node* next=pcur->next;newnode->next=next;pcur->next=newnode;pcur=next;}
}//設置random
void setRandom(Node* head)
{Node* pcur=head;while(pcur){Node* copy=pcur->next;if(pcur->random){copy->random=pcur->random->next;}pcur=copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}//在原鏈表的基礎上拷貝節點并插入到原鏈表中AddNode(head);//設置randomsetRandom(head);//分開新舊鏈表Node* pcur=head;Node* copyHead,*copyTail;copyHead=copyTail=pcur->next;while(copyTail->next){pcur=copyTail->next;copyTail->next=pcur->next;copyTail=copyTail->next;}return copyHead;
}

總結

第二道題徹底把博主寫傻了,論寫到最后圖都背下來了的救贖感(

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

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

相關文章

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南

JSP與Servlet整合數據庫開發:構建Java Web應用的全棧指南 概述 在Java Web開發領域,JSP(JavaServer Pages)與Servlet是構建動態Web應用的核心技術組合。Servlet作為Java EE的基礎組件,負責處理客戶端請求、執行業務邏…

設計五種算法精確的身份證號匹配

問題定義與數據準備 我們有兩個Excel文件: small.xlsx: 包含約5,000條記錄。large.xlsx: 包含約140,000條記錄。 目標:快速、高效地從large.xlsx中找出所有其“身份證號”字段存在于small.xlsx“身份證號”字段中的記錄,并將這些匹配的記錄保…

Spring 框架(IoC、AOP、Spring Boot) 的必會知識點匯總

目錄:🧠 一、Spring 框架概述1. Spring 的核心功能2. Spring 模塊化結構🧩 二、IoC(控制反轉)核心知識點1. IoC 的核心思想2. Bean 的定義與管理3. IoC 容器的核心接口4. Spring Bean 的創建方式🧱 三、AOP…

簡單工廠模式(Simple Factory Pattern)?? 詳解

?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。 🍎個人主頁: Meteors.的博客 💞當前專欄: 設計模式 ?特色專欄: 知識分享 &…

新電腦硬盤如何分區?3個必知技巧避免“空間浪費癥”!

剛到手的新電腦,硬盤就像一間空蕩蕩的大倉庫,文件扔進去沒多久就亂成一鍋粥?別急,本文會告訴你新電腦硬盤如何分區,這些方法不僅可以幫你給硬盤分區,還可以調整/合并分區大小等。所以,本文的分區…

【微知】git submodule的一些用法總結(不斷更新)

文章目錄綜述要點細節如何新增一個submodule?如何手動.gitmodules修改首次增加一個submodule?git submodule init,init子命令依據.gitmodules.gitmodules如何命令修改某個成員以及同步?如果submodule需要修改分支怎么辦&#xff1…

【Spring Cloud微服務】9.一站式掌握 Seata:架構設計與 AT、TCC、Saga、XA 模式選型指南

文章目錄一、Seata 框架概述二、核心功能特性三、整體架構與三大角色1. Transaction Coordinator (TC) - 事務協調器(Seata Server)2. Transaction Manager (TM) - 事務管理器(集成在客戶端)3. Resource Manager (RM) - 資源管理器…

AI賦能!Playwright帶飛UI自動化腳本維護

80%的自動化腳本因一次改版報廢? 開發隨意改動ID導致腳本集體崩潰?背景UI自動化在敏捷開發席卷行業的今天,UI自動化測試深陷一個尷尬困局:需求迭代速度(平均2周1次)> 腳本維護速度(平…

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南

Redis、Zookeeper 與關系型數據庫分布式鎖方案對比及性能優化實戰指南 1. 問題背景介紹 在分布式系統中,多節點并發訪問共享資源時,如果不加鎖或加鎖不當,會導致數據不一致、超賣超買、競態條件等問題。常見的分布式鎖方案包括基于Redis、Zoo…

網絡安全A模塊專項練習任務十一解析

任務十一:IP安全協議配置任務環境說明: (Windows 2008)系統:用戶名Administrator,密碼Pssw0rd1.指定觸發SYN洪水攻擊保護所必須超過的TCP連接請求數閾值為5;使用組合鍵winR,輸入regedit打開注冊表編輯器&am…

金蝶中間件適配HGDB

文章目錄環境文檔用途詳細信息環境 系統平臺:Microsoft Windows (64-bit) 10 版本:5.6.5 文檔用途 本文章主要介紹金蝶中間件簡單適配HGDB。 詳細信息 一、金蝶中間件Apusic安裝與配置 1.Apusic安裝與配置 Windows和Linux下安裝部署過程相同。 &…

使用a標簽跳轉之后,會刷新一次,這個a標簽添加的樣式就會消失

<ul class"header-link"><li><a href"storeActive.html">到店活動</a></li><li><a href"fuwu.html">服務</a></li><li><a href"store.html">門店</a></l…

線程池實現及參數詳解

線程池概述 Java線程池是一種池化技術&#xff0c;用于管理和復用線程&#xff0c;減少線程創建和銷毀的開銷&#xff0c;提高系統性能。Java通過java.util.concurrent包提供了強大的線程池支持。 線程池參數詳解 1. 核心參數 // 創建線程池的完整構造函數 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(動態存儲供應)

K8S 部署 NFS Dynamic Provisioning&#xff08;動態存儲供應&#xff09; 本文檔提供完整的 K8s NFS 動態存儲部署流程&#xff0c;包含命名空間創建、RBAC 權限配置、Provisioner 部署、StorageClass 創建及驗證步驟。 2. 部署步驟 2.1 創建命名空間 首先創建獨立的命名空間 …

JavaEE 進階第二期:開啟前端入門之旅(二)

專欄&#xff1a;JavaEE 進階躍遷營 個人主頁&#xff1a;手握風云 目錄 一、VS Code開發工具的搭建 1.1. 創建.html文件 1.2. 安裝插件 1.3. 快速生成代碼 二、HTML常見標簽 2.1. 換行標簽 2.2. 圖片標簽: img 2.3. 超鏈接 三、表格標簽 四、表單標簽 4.1. input標…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:從RNN到LSTM與GRU

本文將深入探討循環神經網絡&#xff08;RNN&#xff09;的核心原理、其面臨的長期依賴問題&#xff0c;以及兩大革命性解決方案——LSTM和GRU的門控機制&#xff0c;并通過實例和代碼幫助讀者徹底理解其工作細節。1. 引言&#xff1a;時序建模的數學本質在上一篇概述中&#x…

Qt---狀態機框架QState

QState是Qt狀態機框架&#xff08;Qt State Machine Framework&#xff09;的核心類&#xff0c;用于建模離散狀態以及狀態間的轉換邏輯&#xff0c;廣泛應用于UI交互流程、設備狀態管理、工作流控制等場景。它基于UML狀態圖規范設計&#xff0c;支持層次化狀態、并行狀態、歷史…

GitHub 熱榜項目 - 日榜(2025-09-02)

GitHub 熱榜項目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 統計摘要 共發現熱門項目&#xff1a;14 個 榜單類型&#xff1a;日榜 本期熱點趨勢總結 本期GitHub熱榜呈現AI Agent生態爆發趨勢&#xff0c;Koog、Activepieces等項目推動多平臺智能體開發框架成熟。語…

華為衛星對星引導技術深度解析:原理、實現與開源替代方案

利號&#xff1a;CNXXXXXX 涉及多傳感器融合/自適應波束成形/軌道預測算法一、技術原理剖析&#xff1a;衛星間高精度指向的核心挑戰在低軌衛星&#xff08;LEO&#xff09;星座中&#xff0c;衛星間鏈路&#xff08;ISL&#xff09;的建立面臨三大技術難題&#xff1a;1. 動力…

水下管道巡檢機器人結構設cad+三維圖+設計說明書

目 錄 1 緒論 1 1.1 選題的背景及意義 1 1.2 水下管道巡檢機器人的分類 2 1.2.1 管道巡檢技術的分類 2 1.2.2管道巡檢機器人的分類 2 1.3 研究的現狀 3 1.3.1 國內的研究現狀 3 1.3.2 國外的研究現狀 4 1.4 水下管道巡檢機器人的發展趨勢 5 1.…