OJ隨機鏈表的復制題目分析

題目內容:

138. 隨機鏈表的復制 - 力扣(LeetCode)

分析:?

這道題目,第一眼感覺非常亂,這是正常的,但是我們經過仔細分析示例明白后,其實也并不是那么難。現在讓我們一起來分析分析吧!

1.題目要求的是鏈表的復制,那么我們得想我們該怎么做,才能很好地進行下去呢?

2.是直接把原鏈表一個一個地移動過來?這思路果斷不對,它還要保持原來的鏈表不被復制啊.

3.經過觀察,我們發現13的random指向7。各種穿插的,所以我們采用

?

//復制struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;struct Node*Next=cur->next;cur->next=copy;copy->next=Next;cur=Next;}

復制部分:

先在每個數復制下來,分別放在它的原數字的下一個。即下圖:

4.接著你看它原鏈表的那些數字。7的random指向NULL,13的random指向7.(其他的省略說)。7的next指向13。看到這種規律,我們試想是不是可以把復制的也弄成這樣子,就形成了一個獨立的復制鏈表了,對吧??

連線部分:

?

 //連接線cur=head;while(cur){struct Node* copy=cur->next;// struct Node* Next=cur->next->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}

如下圖:

你看復制完了之后,是不是可以直接它復制那部分挪下來,它也是不會破壞原鏈表的,這是不是就符合題目要求了對吧?

5.完成了這步了之后,到了我們一個一個挪的那部分了。

如下圖:

?

解釋上圖:

 //復制的挪下來,恢復原鏈表struct Node* copyhead=NULL,*copytail=NULL;cur=head; while(cur){struct Node* copy=cur->next;struct Node* Next=copy->next; //尾插if(copyhead==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}

挪動部分:

當我們復制完了之后,開始挪新的復制鏈表:

1.首先定義一個cur指針指向head頭。再定義一個next指針指向cur的下一個(方便它隨時都能返回找到copy的位置)。

2.定義兩個指針分別為copyhead和copytail指針,放在新的鏈表那里當作移動工具和最后返回工具

2.接著,相當于進行尾插,當?第一次時,copyhead和copytail都為空時,就把copy值直接放到這個指針

3.不為空時,就把copy值放到copytail的下一位。

恢復部分:

最后,恢復原來的鏈表,即去掉它copy的那些數:

1.因為我們上面都沒有動過cur的位置,所以這里就直接使用cur這個指針就行了。

2.把cur的下一個給Next即:? 把cur的下一個next給給cur的next的next(即cur的下下個)。

  //恢復鏈表cur->next=Next;cur=Next; 

總代碼:?

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) {//復制struct Node* cur=head;while(cur){struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;struct Node*Next=cur->next;cur->next=copy;copy->next=Next;cur=Next;}//連接線cur=head;while(cur){struct Node* copy=cur->next;// struct Node* Next=cur->next->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}//復制的挪下來,恢復原鏈表struct Node* copyhead=NULL,*copytail=NULL;cur=head; while(cur){struct Node* copy=cur->next;struct Node* Next=copy->next; //尾插if(copyhead==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}//恢復鏈表cur->next=Next;cur=Next; }return copyhead;
}

最后,特別要注意的是:cur的位置要每到一部分都要及時更新變成head。(因為它每一部分都在改變),不然就會像我一開始那樣,發現怎么都不正確哇哇哇哇。

每次雞湯:

好啦,到了我們的每次雞湯部分:

雖然我每次邁出的那一步都很小,但是終究會有那么一天會到達終點的。加油吧,青年。

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

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

相關文章

uc/os-II 原理及應用(一) 嵌入式實時系統基本概念

基于嵌入式實時操作系統μCOS-II原理及應用(第2版)-任哲 自行網上尋找資源。 計算機系統的中分為計算機硬件系統與計算機軟件系統,計算機軟件系統由上到下分為,應用軟件,系統軟件,操作系統;操作系統一般在計算機軟件的最低層&…

C++ 并發專題 - std::promise 和 std::future 介紹

一:概述 std::promise 和 std::future 是C標準庫的兩種工具,主要用于實現線程之間的異步通信。它們屬于C并發庫的一部分,提供了一種安全,優雅的方式來在線程之間傳遞結果或狀態。 二:std::promise 介紹 std::promise …

【Multisim用74ls92和90做六十進制】2022-6-12

緣由Multisim如何用74ls92和90做六十進制-其他-CSDN問答 74LS92、74LS90參考

【UE5 C++課程系列筆記】21——弱指針的簡單使用

目錄 概念 聲明和初始化 轉換為共享指針 打破循環引用 弱指針使用警告 概念 在UE C 中,弱指針(TWeakPtr )也是一種智能指針類型,主要用于解決循環引用問題以及在不需要強引用保證對象始終有效的場景下,提供一種可…

數據庫知識匯總2

一. 范式 定義:范式是符合某一種級別的關系模式的集合。 關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式; 一個低一級范式的關系模式,通過模式分解(schema decomposition)可以轉換為若干個高一…

C# 設計模式(結構型模式):橋接模式

C# 設計模式(結構型模式):橋接模式 在軟件設計中,我們經常會遇到系統的變化頻繁,或者需要靈活擴展功能的場景。這時,橋接模式(Bridge Pattern)便顯得尤為重要。橋接模式是一個結構型…

Flash Attention V3使用

Flash Attention V3 概述 Flash Attention 是一種針對 Transformer 模型中注意力機制的優化實現,旨在提高計算效率和內存利用率。隨著大模型的普及,Flash Attention V3 在 H100 GPU 上實現了顯著的性能提升,相比于前一版本,V3 通…

【51單片機零基礎-chapter6:LCD1602調試工具】

實驗0-用顯示屏LCD驗證自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }實驗1-編寫LCD1602液晶顯示屏驅動函…

【網絡】ARP表、MAC表、路由表

ARP表 網絡設備存儲IP-MAC映射關系的表項&#xff0c;便于快速查找和轉發數據包 ARP協議工作原理 ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;地址解析協議&#xff0c;能夠將網絡層的IP地址解析為數據鏈路層的MAC地址。 1.主機在自己的ARP緩沖區中建…

Ubuntu22.04雙系統安裝記錄

1.Ubuntu24.04在手動分區時&#xff0c;沒有efi選項&#xff0c;需要點擊分區界面左下角&#xff0c;選擇efi的位置&#xff0c;然后會自動創建/boot/efi分區&#xff0c;改到2GB大小即可。 2.更新Nvidia驅動后&#xff0c;重啟電腦wifi消失&#xff0c;參考二選一&#xff1a…

Python Notes 1 - introduction with the OpenAI API Development

Official document&#xff1a;https://platform.openai.com/docs/api-reference/chat/create 1. Use APIfox to call APIs 2.Use PyCharm to call APIs 2.1-1 WIN OS.Configure the Enviorment variable #HK代理環境&#xff0c;不需要科學上網(價格便宜、有安全風險&#…

【Python其他生成隨機字符串的方法】

在Python中&#xff0c;除了之前提到的方法外&#xff0c;確實還存在其他幾種生成隨機字符串的途徑。以下是對這些方法的詳細歸納&#xff1a; 方法一&#xff1a;使用random.randint結合ASCII碼生成 你可以利用random.randint函數生成指定范圍內的隨機整數&#xff0c;這些整…

leetcode hot 100 跳躍游戲

55. 跳躍游戲 已解答 中等 相關標簽 相關企業 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則…

《Vue3實戰教程》40:Vue3安全

如果您有疑問&#xff0c;請觀看視頻教程《Vue3實戰教程》 安全? 報告漏洞? 當一個漏洞被上報時&#xff0c;它會立刻成為我們最關心的問題&#xff0c;會有全職的貢獻者暫時擱置其他所有任務來解決這個問題。如需報告漏洞&#xff0c;請發送電子郵件至 securityvuejs.org。…

01.02周二F34-Day44打卡

文章目錄 1. 這家醫院的大夫和護士對病人都很耐心。2. 她正跟一位戴金邊眼鏡的男士說話。3. 那個人是個圓臉。4. 那個就是傳說中的鬼屋。5. 他是個很好共事的人。6. 我需要一杯提神的咖啡。7. 把那個卷尺遞給我一下。 ( “卷尺” 很復雜嗎?)8. 他收到了她將乘飛機來的消息。9.…

Spring Boot項目中使用單一動態SQL方法可能帶來的問題

1. 查詢計劃緩存的影響 深入分析 數據庫系統通常會對常量SQL語句進行編譯并緩存其執行計劃以提高性能。對于動態生成的SQL語句&#xff0c;由于每次構建的SQL字符串可能不同&#xff0c;這會導致查詢計劃無法被有效利用&#xff0c;從而需要重新解析、優化和編譯&#xff0c;…

【Rust自學】10.2. 泛型

喜歡的話別忘了點贊、收藏加關注哦&#xff0c;對接下來的教程有興趣的可以關注專欄。謝謝喵&#xff01;(&#xff65;ω&#xff65;) 題外話&#xff1a;泛型的概念非常非常非常重要&#xff01;&#xff01;&#xff01;整個第10章全都是Rust的重難點&#xff01;&#xf…

Spark-Streaming有狀態計算

一、上下文 《Spark-Streaming初識》中的NetworkWordCount示例只能統計每個微批下的單詞的數量&#xff0c;那么如何才能統計從開始加載數據到當下的所有數量呢&#xff1f;下面我們就來通過官方例子學習下Spark-Streaming有狀態計算。 二、官方例子 所屬包&#xff1a;org.…

Python 3 輸入與輸出指南

文章目錄 1. 輸入與 input()示例&#xff1a;提示&#xff1a; 2. 輸出與 print()基本用法&#xff1a;格式化輸出&#xff1a;使用 f-string&#xff08;推薦&#xff09;&#xff1a;使用 str.format()&#xff1a;使用占位符&#xff1a; print() 的關鍵參數&#xff1a; 3.…

【SQLi_Labs】Basic Challenges

什么是人生&#xff1f;人生就是永不休止的奮斗&#xff01; Less-1 嘗試添加’注入&#xff0c;發現報錯 這里我們就可以直接發現報錯的地方&#xff0c;直接將后面注釋&#xff0c;然后使用 1’ order by 3%23 //得到列數為3 //這里用-1是為了查詢一個不存在的id,好讓第一…