【LeetCode刷題指南】--隨機鏈表的復制

🔥個人主頁:@草莓熊Lotso

🎬作者簡介:C++研發方向學習者

📖個人專欄:?《C語言》?《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》

??人生格言:生活是默默的堅持,毅力是永久的享受。??

前言:?隨著編程相關知識點的學習,我們LeetCode的刷題也不能落下。在前面我們也接觸到了洛谷和牛客這兩個刷題網站,但是博主一直都在推薦大家使用力扣,是因為力扣的判題嚴謹且大部分都是接口型題目,與面試中的筆試題也更加貼合。那么還是老樣子,博主會為大家提供我自己的思路和代碼,但是算法題的解法肯定不止一個,歡迎大家一起交流和討論。


目錄

鏈表的隨機復制

解題過程:

代碼演示:


鏈表的隨機復制

題目鏈接:138. 隨機鏈表的復制 - 力扣(LeetCode)

題目描述:?

題目示例:?

思路:在原鏈表基礎上拷貝節點,置random指針,斷開新舊鏈表

解題過程:

1.我們首先需要了解一下什么是淺拷貝什么是深拷貝


淺拷貝(Shallow Copy):

? 定義:僅復制變量本身的值,對于指針類型的成員,只復制指針的地址,而不復制指針所指向的內存內容。

? 特點:

? 拷貝后,原變量和新變量中的指針指向同一塊內存空間。

? 實現簡單,通常通過直接賦值(如=運算符)或memcpy等函數完成。

? 風險:當其中一個指針釋放內存后,另一個指針會變成野指針,再次操作可能導致內存錯誤(如重復釋放、訪問已釋放內存)。

深拷貝(Deep Copy):

? 定義:不僅復制變量本身的值,對于指針類型的成員,會先為新變量的指針分配新的內存空間,再將原指針指向的內容復制到新內存中。

? 特點:

? 拷貝后,原變量和新變量中的指針指向各自獨立的內存空間,兩者互不影響。

? 需要手動實現,通常通過自定義函數完成(需顯式分配內存并復制內容)。

? 安全性高,避免了淺拷貝的內存沖突問題,但實現相對復雜,且會額外消耗內存。

2. 在原鏈表的基礎上拷貝節點

3.置random指針?

一定要記住:copy->random=pcur->random->next

4.斷開新舊鏈表?

時間復雜度:O(N)

代碼演示:

/*** 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 InsertaList(Node*head)
{Node*pcur=head;while(pcur){Node*newnode=BuyNode(pcur->val);Node*next=pcur->next;pcur->next=newnode;newnode->next=next;pcur=next;}
}
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;}//拷貝原鏈表的節點并插入原鏈表中InsertaList(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;
}

?

這里需要特別注意一下,如果為空特殊處理,不然運行會有問題


往期回顧:?

【數據結構初階】--雙向鏈表(一)

【數據結構初階】--雙向鏈表(二)

結語:本篇文章就到此結束了,《LetetCode刷題指南》中的題目比起之間的C語言刷題集中的題目,肯定會更加復雜一些。而且題目形式也不一樣,大家需要注意一下。如果文章對你有幫助的話,歡迎評論,點贊,收藏加關注,感謝大家的支持

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

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

相關文章

系統學習算法:專題十四 鏈表

前提知識:1.畫圖,數據結構相關的題,畫圖必不可少,只要能畫出來,那么后面的代碼就很容易能寫出來,因為將抽象的數據結構轉換為直觀的圖畫2.引入虛擬頭結點,也叫哨兵位,能夠避免考慮很…

零基礎學后端-PHP語言(第一期-PHP環境配置)

從本期開始,我們學習PHP,但是我們要先配置PHP環境 PHP官網鏈接:PHP For Windows: Binaries and sources Releases 我們可以看到有以下資源 可以看到有很多php的版本,有Non Thread Safe和Thread Safe,還有zip&#xf…

C++ primer知識點總結

《C Primer》系統學習指南:從C到C的平滑過渡根據你提供的《C Primer》目錄和你的需求(C語言背景轉C,側重網絡編程),我將為你制定一個全面的學習計劃,包含知識點詳解、C/C對比、實戰案例和分階段項目練習。第…

異構融合 4A:重構高性能計算與復雜場景分析的安全與效率邊界

當全球數據量以每兩年翻一番的速度爆炸式增長,高性能計算(HPC)與復雜場景分析正成為破解氣候預測、基因測序、金融風控等世界級難題的關鍵引擎。但異構計算環境的碎片化、多系統協同的復雜性、數據流動的安全風險,正在形成制約行業…

【華為機試】240. 搜索二維矩陣 II

文章目錄240. 搜索二維矩陣 II描述示例 1示例 2提示解題思路核心分析問題轉化算法實現方法1:右上角開始搜索(推薦)方法2:逐行二分查找方法3:分治法方法4:左下角開始搜索復雜度分析核心要點數學證明右上角搜…

瘋狂星期四文案網第16天運營日記

網站運營第16天,點擊觀站: 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨日30多ip, 今天也差不多,同步上周下降了一些,感覺明天瘋狂星期四要少很多了,記得上周四700多ip&…

Linux系統基礎入門與配置指南

Linux基本概述與配置 一、我們為什么使用Linux(Linux的優點)開源與自由 免費: 無需支付許可費用,任何人都可以自由下載、安裝和使用。源代碼開放: 任何人都可以查看、修改和分發源代碼。這帶來了極高的透明度、安全性和…

如何刪除VSCode Marketplace中的publisher

網頁上并沒有提供刪除的按鈕,需要通過命令的形式刪除。 vsce delete-publisher [要刪除的名字]# 鍵入token # y 確認這里的token是之前在Azure DevOps中創建的token,忘了的話可以重建一個 刷新網頁看一下 成功刪除了。

Windows安裝git教程(圖文版)

Git 是一個分布式版本控制系統,用于跟蹤文件的變化,特別是在軟件開發中。它使得多個開發者可以在不同的機器上并行工作,然后將他們的改動合并在一起。是在開發過程中,經常會用到的一個工具。本章教程,主要介紹Windows上…

Remote Framebuffer Protocol (RFB) 詳解

RFC 6143 規范文檔:The Remote Framebuffer Protocol 文章目錄1. 引言2. 初始連接流程2.1 TCP連接建立2.2 協議版本協商2.3 安全握手3. 顯示協議機制3.1 核心概念3.2 像素格式4. 輸入協議4.1 鍵盤事件(KeyEvent)4.2 鼠標事件(PointerEvent)5. 協議消息詳解5.1 握手消…

從 DeepSeek-V3 到 Kimi K2:八種現代大語言模型架構設計

編譯:青稞社區Kimi 原文:https://magazine.sebastianraschka.com/p/the-big-llm-architecture-comparison 首發:https://mp.weixin.qq.com/s/lSM2jk1UxJVz1WllWYQ4aQ 自原始 GPT 架構開發以來已經過去了七年。乍一看,從 2019 年的…

linux驅動開發筆記--GPIO驅動開發

目錄 前言 一、設備樹配置 二、驅動編寫 三、用戶空間測試 總結 前言 開發平臺:全志A133,開發環境:linux4.9andrio10,開發板:HelperBoard A133_V2.5。 一、設備樹配置 打開板級設備樹配置文件,路徑&a…

騰訊iOA:企業軟件合規與安全的免費守護者

人們眼中的天才之所以卓越非凡,并非天資超人一等而是付出了持續不斷的努力。1萬小時的錘煉是任何人從平凡變成超凡的必要條件。———— 馬爾科姆格拉德威爾 目錄 一、為什么要使用騰訊iOA? 二、中小企業軟件合規痛點 三、騰訊iOA解決方案 3.1 核心技…

C#定時任務實戰指南:從基礎Timer到Hangfire高級應用

高效管理后臺作業,讓定時任務成為應用的可靠引擎 在C#應用開發中,定時任務是實現數據同步、報表生成、系統維護等后臺作業的核心技術。本文將深入探討C#生態中主流的定時任務解決方案,從基礎的內置Timer到強大的Quartz.NET和Hangfire框架&…

軟件開發、項目開發基本步驟

? 立項階段:項目定義、需求收集與分析、可行性分析、風險評估與規劃、項目團隊組建、制定項目計劃、獲取批準與支持。? 需求評審與分析:? 項目團隊(包括產品經理、開發人員、測試人員等)共同參與,明確項目的目標、功…

慢 SQL接口性能優化實戰

在對某電商項目進行接口性能壓測時,發現 /product/search 接口響應緩慢,存在明顯性能瓶頸。通過慢查詢日志排查和 SQL 優化,最終實現了接口響應速度的顯著提升。本文完整還原此次優化過程,特別強調操作步驟和問題分析過程&#xf…

【C#】在WinForms中實現控件跨TabPage共享的優雅方案

文章目錄一、問題背景二、基本實現方案1. 通過修改Parent屬性實現控件移動三、進階優化方案1. 創建控件共享管理類2. 使用用戶控件封裝共享內容四、方案對比與選擇建議五、最佳實踐建議六、完整示例代碼一、問題背景 在Windows窗體應用程序開發中,我們經常遇到需要…

Android Camera openCamera

由頭 今日調休,終于終于閑下來了,可以寫一下博客了,剛好打開自己電腦,就有四年前下的谷歌Android 12源碼,不是很舊,剛好夠用,不用再另外下載新源碼了,不得不感慨這時間過得真快啊~廢…

神經網絡——池化層

目錄 池化層 最大池化層 MaxPool2d 最大池化操作圖示 最大池化操作代碼演示 綜合代碼案例 池化層 池化層(Pooling Layer) 核心作用:通過降采樣減少特征圖尺寸,降低計算量,增強特征魯棒性。 1. 常見類型 …

Android 默認圖庫播放視頻沒有自動循環功能,如何添加2

Android 默認圖庫播放視頻沒有自動循環功能, 如何添加 按如下方式修改可以添加 開發云 - 一站式云服務平臺 --- a/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java +++ b/packages/apps/Gallery2/src/com/android/gallery3d/app/MovieActivity.java…