劍指Offer35- - 鏈表

1. 題目描述

這題題意感覺說的不是很清楚,容易讓人產生歧義!其實題意很簡單,給你一個鏈表 head,你深拷貝它,然后返回即可,注意不能修改原鏈表

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/


2. 坑

首先,這題絕對沒你看上去的那么簡單,復制鏈表?太簡單了,不就是鏈表的創建嗎?
不!本題有一個有意思的地方,就是它有一個隨機指針,隨機指針以為著什么?
意味著,它指向的節點,可能還未創建!
因此說,我們不能直接遍歷鏈表,來創建新鏈表,需要一些特殊方法



3. 思路1 – 哈希表

O ( N ) O(N) O(N)時間, O ( N ) O(N) O(N)空間

思路呢,也很簡單,既然隨機指針可能指向一個還未創建的節點,那么我們就先創建它,然后通過哈希表存起來,并與原鏈表的相應節點做映射。
這樣,當我們下次遍歷到這個隨機節點時,我們可以檢查一下哈希表,看看是否已經建立過了,避免重復創建節點。

代碼

// 本題的難點主要在于,當我們需要將指針指向某個節點時
// 隨機指針指向的節點可能還不存在
class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr) return nullptr;Node *dummy = new Node(-1);Node *cur = dummy;// refto 存儲的是,原鏈表head與它的拷貝之間的映射unordered_map<Node*, Node*> refto;while(head) { // 遍歷原鏈表的每一個節點,創建它自己和他的random指針指向的節點// 并讓它的random指針指向原鏈表random指針指向的節點if(refto[head] == nullptr) {Node *newNode = new Node(head->val);refto[head] = newNode;}if(head->random && refto[head->random] == nullptr) {Node *newNode = new Node(head->random->val);refto[head->random] = newNode;}refto[head]->random = refto[head->random];cur->next = refto[head];cur = refto[head];head = head->next;}return dummy->next;}
};


4. 思路2 – 原地修改

O ( N ) O(N) O(N) 時間, O ( 1 ) O(1) O(1)空間。

參考題解,最后的動圖很易懂!
注意在計算空間復雜度時,是不考慮創建新鏈表產生的空間的,因為那是必須的,我們主要考慮的時額外空間的復雜度

大體思路,只要看了題解中的動圖演示,基本就了解了,這里主要闡述一下流程:

  1. 遍歷原鏈表,對于鏈表中的每個節點 n o d e node node,在它的后面新創建一個新節點 n e w N o d e newNode newNode并插入到鏈表當中,即 n o d e node node ?? n e w N o d e newNode newNode ?? n o d e node node-> n e x t next next,這個 n e w N o d e newNode newNode 就是對 n o d e node node 的深拷貝。(這一步就是核心所在,直接在原鏈表的基礎上創建新鏈表,然后再把它分離出來,太妙了!!)
  2. 修改 n e w N o d e newNode newNode r a n d o m random random 指針。
  3. 創建新鏈表的頭,修改 n e w N o d e newNode newNode n e x t next next

代碼

class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr) return nullptr;// 原地拷貝for(Node *node = head; node != nullptr; node = node->next->next) {Node *newNode = new Node(node->val);// node -> newNode -> node.nextnewNode->next = node->next;node->next = newNode;}// 修改random指針for(Node *node = head; node != nullptr; node = node->next->next) {Node *newNode = node->next;// 判斷下randodm是否存在,存在的話,才有我們的copy// 注意要指向node->random->next而不是node->random// 因為node->random->next是我們自己創建的newNode->random = (node->random != nullptr) ? node->random->next : nullptr;}// 修改next指針以分離我們創建的鏈表Node *newHead = head->next;for(Node *node = head; node != nullptr; node = node->next) {Node *newNode = node->next;node->next = newNode->next; // 恢復原鏈表的next指針// 判斷下一個節點是否存在,存在的話,才有我們的copynewNode->next = (newNode->next != nullptr) ? newNode->next->next : nullptr; // 修改我們創建的鏈表的指針}return newHead;}
};

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

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

相關文章

C 語言常用關鍵字詳解:static、const、volatile

C 語言常用關鍵字詳解&#xff1a;static、const、volatile 文章目錄 C 語言常用關鍵字詳解&#xff1a;static、const、volatile1. static 關鍵字1.1 用于局部變量示例&#xff1a; 1.2 用于全局變量示例&#xff1a; 1.3 用于函數示例&#xff1a; 2. const 關鍵字2.1 用于局…

Centos7本地部署阿里Qwen2-7B模型

1.從hagging face下載模型 2.把下載的模型文件&#xff0c;放到/usr/local/Qwen2-7B目錄下 3.創建虛擬環境&#xff0c;安裝依賴 1.環境安裝 sudo yum update -y sudo yum install -y python3 python3-pip git 2.創建虛擬環境并激活 python3 -m venv qwen2_env source qwen2_…

群暉監控套件通過ONVIF協議添加海康攝像頭

1. 首先登錄錄像機 通道管理 找到每個攝像頭的IP地址 2. 登錄某個攝像頭 配置 3. 添加用戶名&#xff08;注意不能是admin&#xff09; 設置賬戶密碼 用戶類型選管理員 4. 群暉里面添加攝像頭&#xff0c;自動搜索&#xff0c;添加剛剛那個IP的攝像頭 5. 驗證…

【C++】 —— 筆試刷題day_8

一、求最小公倍數 題目解析 題目很簡單&#xff0c;給定兩個數a和b求它們的最小公倍數。 算法思路 對于求兩個數的最小公倍數問題&#xff0c;想必已經非常熟悉了&#xff1b; 在之前學校上課時&#xff0c;記得老師提起過&#xff0c;最小公倍數 兩個數的乘積 除以最大公約數…

MTK Android12-Android13 設置系統默認語言

Android 系統&#xff0c;默認語言 文章目錄 需求&#xff1a;場景 參考資料實現方案實現思路編譯腳本熟悉-平臺熟悉mssi_64_cnkernel-4.19 解決方案修改文件-實現方案 源碼分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定義get-default-product-locale 方法定義PRODUCT_DE…

系統如何查找文件?inode號又是什么?

下面分別詳細解釋您提到的三個問題&#xff1a; “文件系統怎么定位文件”、“inode 是什么”、“為什么刪除后還可能被占用”。 一、文件系統怎么定位文件 1.1 目錄與文件名并不直接存儲文件數據 在常見的 Unix/Linux 文件系統&#xff08;如 ext4、xfs&#xff09;或類似的…

05-SpringBoot3入門-整合SpringMVC(配置靜態資源、攔截器)

1、說明 在01-SpringBoot3入門-第一個項目-CSDN博客中&#xff0c;其實就已經整合了SpringMVC。下面講解怎么配置靜態資源和攔截器 2、配置靜態資源 命名&#xff1a;static&#xff08;文件夾&#xff09; 位置&#xff1a;src/main/resources 編寫一個html文件 訪問 http:/…

Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測

聚劃算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測 目錄 聚劃算&#xff01;Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多變量回歸預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 聚劃算&#xff01;Tran…

樹莓派瀏覽器配置全解析:從輕量系統到網頁應用平臺

樹莓派&#xff08;Raspberry Pi&#xff09;不僅是嵌入式開發的入門利器&#xff0c;也因其低成本和強大的社區支持而成為物聯網、數字標牌、教育培訓等領域的熱門平臺。在很多應用中&#xff0c;運行一個瀏覽器并作為 Web 前端展示、操作或交互的能力顯得尤為關鍵。 但在資源…

初識Qt(一)

本文部分ppt、視頻截圖原鏈接&#xff1a;萌馬工作室的個人空間-萌馬工作室個人主頁-嗶哩嗶哩視頻 1. Qt是什么&#xff1f; Qt是一個跨平臺的C應用程序開發框架&#xff0c;它既為圖形用戶界面(GUI)程序開發提供了強大支持&#xff0c;也能用于開發非GUI的控制臺程序、服務端…

六十天前端強化訓練之第三十二天之Babel 轉譯配置大師級深度講解

歡迎來到編程星辰海的博客講解 看完可以給一個免費的三連嗎&#xff0c;謝謝大佬&#xff01; 目錄 一、核心概念與知識體系詳解 1. Babel 工作原理全景解析 二、完整配置方案&#xff08;帶詳細注釋&#xff09; 1. 進階版 .babelrc 配置 2. Webpack 集成配置&#xff08…

智能提示詞生成器:助力測試工程師快速設計高質量測試用例

在軟件測試中,測試用例設計方法的選擇和實施是確保軟件質量的重要步驟。測試工程師經常需要根據不同的測試場景、參數維度和業務需求,設計出覆蓋率高且有效的測試用例。然而,設計測試用例并非易事,特別是在面對復雜的業務邏輯時。 為了幫助測試工程師高效生成測試用例提示…

beanie.exceptions.CollectionWasNotInitialized

遇到這樣的情況不要慌&#xff0c;不要慌 1&#xff1a;檢查模型是否已經初始化&#xff1a; class TaskModel(Document):"""定時任務模型"""task_id: str Field(default_factorylambda: str(uuid.uuid4()), # 新增默認值description"任…

【CVE-2025-30208】| Vite-漏洞分析與復現

漏洞簡介 CVE-2025-30208 是 Vite 開發服務器中的一個任意文件讀取漏洞。該漏洞允許攻擊者通過特定的 URL 參數繞過訪問控制&#xff0c;從而讀取服務器上的敏感文件&#xff08;如 /etc/passwd 或 C:\windows\win.ini&#xff09;。 該漏洞主要影響以下版本的 Vite&#xff…

將 Markdown 表格結構轉換為Excel 文件

在數據管理和文檔編寫過程中&#xff0c;我們經常使用 Markdown 來記錄表格數據。然而&#xff0c;Markdown 格式的表格在實際應用中不如 Excel 方便&#xff0c;特別是需要進一步處理數據時。因此&#xff0c;我們開發了一個使用 wxPython 的 GUI 工具&#xff0c;將 Markdown…

Golang使用 ip2region 查詢IP的地區信息

利用 ip2region 進行 IP 地址定位 import ("fmt""log""github.com/lionsoul2014/ip2region/binding/golang/xdb" )func main() {ip : "213.118.179.98"dbPath : ".\\cmd\\ip\\ip2region.xdb"// 1、初始化查詢器//searcher,…

對匿名認證的理解

概述&#xff1a;在 Spring Security 中&#xff0c;** 匿名認證&#xff08;Anonymous Authentication&#xff09;** 是一種特殊的認證機制&#xff0c;用于處理未提供有效憑證的請求。 匿名認證的本質 目的&#xff1a;允許未認證用戶訪問特定資源。原理&#xff1a; 當請求…

C++調用Python

Python安裝 地址&#xff1a; python官網 可以根據需要下載對應的版本。 調用python python測試腳本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例計算邏輯if __name__ "__main__":# 從命令行參數讀取 JSON 字符串try…

工程數字建造管理系統平臺有哪些?好的數字建造管理系統推薦

一、什么是工程數字建造管理系統平臺&#xff1f; 工程數字建造管理系統平臺是一種集成了先進信息技術&#xff08;如云計算、大數據、物聯網等&#xff09;的綜合性管理工具&#xff0c;它旨在通過數字化手段提升工程建造全過程的管理效率和決策水平。這一平臺不僅覆蓋了工程…

Android開發EmojiCompat 初始化

Android開發EmojiCompat 初始化 報錯信息&#xff1a; ensure spannable:java.lang.IllegalStateException: EmojiCompat is not initialized 在Application上寫上下面代碼即可&#xff1a; EmojiCompat.Config config new BundledEmojiCompatConfig(this);EmojiCompat.in…