138. Copy List with Random Pointer

目錄

題目描述

方法一、使用哈希表

方法二、不使用哈希表


題目描述

?

問題的關鍵是,random指針指向的是原鏈表的結點,這個原鏈表的結點對應哪一個新鏈表的結點呢?有兩種辦法。一是用哈希表。另一種是復制原鏈表的每一個結點,并將新結點接在原結點的后面組成一個長度加倍的鏈表,這樣原結點的直接后繼就是該原結點對應的新結點。

方法一、使用哈希表

unordered_map<Node*,Node*> new_table;//鍵是原鏈表中的舊結點,值是新鏈表中的新結點

unordered_map<Node*,Node*> random_table;//鍵是原鏈表中的舊結點,值是該舊結點的random指針指向的結點

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr)return nullptr;unordered_map<Node*,Node*> new_table;//鍵是原鏈表中的舊結點,值是新鏈表中的新結點unordered_map<Node*,Node*> random_table;//鍵是原鏈表中的舊結點,值是該舊結點的random指針指向的結點Node* newHead = nullptr;Node* newTail = nullptr;Node* cur = head;//第一步,建立新鏈表while(cur){Node* node = new Node(cur->val);new_table.insert({cur,node});random_table.insert({cur,cur->random});if(newHead == nullptr){newHead = node;newTail = node;}else{newTail->next = node;newTail = node;}cur = cur->next;}//第二步,設置新鏈表結點的random指針for(const auto& [old_node,new_node] : new_table){if(random_table[old_node]){new_node->random = new_table[random_table[old_node]];}}return newHead;}
};

實際上前面做法中的random_table是可以不需要的。

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr)return nullptr;unordered_map<Node*,Node*> new_table;//鍵是原鏈表中的舊結點,值是新鏈表中的新結點Node* newHead = nullptr;Node* newTail = nullptr;Node* cur = head;//第一步,建立新鏈表while(cur){Node* node = new Node(cur->val);new_table.insert({cur,node});if(newHead == nullptr){newHead = node;newTail = node;}else{newTail->next = node;newTail = node;}cur = cur->next;}cur = head;Node* new_cur = newHead;//第二步,設置新鏈表結點的random指針while(cur){if(cur->random){new_cur->random = new_table[cur->random];}cur = cur->next;new_cur = new_cur->next;}return newHead;}
};

方法二、不使用哈希表

第一步,復制每一個舊結點,并將新結點接在舊結點的后面組成新舊結點交替出現的長度翻倍的大鏈表。

第二步,設置新結點的random指針。

第三步,從大鏈表中提取出新結點組成新鏈表,并將原鏈表復原。

需要著重強調的是,第二步和第三步必須分開來做。

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {
public:Node* copyRandomList(Node* head) {if(head == nullptr)return nullptr;Node* cur = head;//復制每一個舊結點,并將新結點接在舊結點的后面while(cur){Node* node = new Node(cur->val);Node* temp = cur->next;node->next = cur->next;cur->next = node;cur = temp;}cur = head;//設置新結點的random指針while(cur){if(cur->random)cur->next->random = cur->random->next;cur = cur->next->next;//原鏈表向前走一位}Node* new_head = nullptr;Node* new_tail = nullptr;cur = head;//提取出新結點組成新鏈表,并將原鏈表復原while(cur){if(new_head == nullptr){new_head = cur->next;new_tail = cur->next;}else{new_tail->next = cur->next;new_tail = cur->next;}cur->next = cur->next->next;//復原原鏈表cur = cur->next;//原鏈表向前走一步}return new_head;}
};

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

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

相關文章

如何評估開源商城小程序源碼的基礎防護能力?

在電商行業快速發展的背景下&#xff0c;開源商城已經為更多企業或者開發者的首選方案&#xff0c;不過并不是所有的開源商城源碼都能讓人放心使用&#xff0c;今天就帶大家一起了解下如何評估開源商城小程序源碼的基礎防護能力&#xff0c;幫助大家更好地篩選安全性高的商城源…

[Vue]跨組件傳值

父子組件傳值 詳情可以看文章 跨組件傳值 Vue 的核?是單向數據流。所以在父子組件間傳值的時候&#xff0c;數據通常是通過屬性從?組件向?組件&#xff0c;??組件通過事件將數據傳遞回?組件。多層嵌套場景?般使?鏈式傳遞的?式實現provideinject的?式適?于需要跨層級…

悠易科技智能體矩陣撬動AI全域營銷新時代

大數據產業創新服務媒體 ——聚焦數據 改變商業 在數字化浪潮與AI技術的雙重驅動下&#xff0c;數據營銷正經歷前所未有的變革&#xff0c;從傳統的全域智能營銷&#xff0c;邁向更具顛覆性的AI全域營銷時代。 麥肯錫的報告顯示&#xff0c;采用AI驅動營銷的企業&#xff0c;客…

Xilinx XCAU10P-2FFVB676I 賽靈思 Artix UltraScale+ FPGA

XCAU10P-2FFVB676I 是 AMD Xilinx 推出的 Artix UltraScale? FPGA 器件&#xff0c;內部集成了約 96,250 邏輯單元&#xff0c;滿足中等規模高性能應用的需求。該芯片采用 16 nm FinFET 制程工藝&#xff0c;核心電壓典型值約 0.85 V&#xff0c;能夠在較低功耗下提供高達 775…

Java SpringBoot 項目中 Redis 存儲 Session 具體實現步驟

目錄 一、添加依賴二、配置 Redis三、配置 RedisTemplate四、創建控制器演示 Session 使用五、啟動應用并測試六、總結 Java 在 Spring Boot 項目中使用 Redis 來存儲 Session&#xff0c;能夠實現 Session 的共享和高可用&#xff0c;特別適用于分布式系統環境。以下是具體的實…

分布式電源的配電網無功優化

分布式電源(Distributed Generation, DG)的大規模接入配電網,改變了傳統單向潮流模式,導致電壓波動、功率因數降低、網損增加等問題,無功優化成為保障配電網安全、經濟、高效運行的關鍵技術。 1. 核心目標 電壓穩定性:抑制DG并網點(PCC)及敏感節點的電壓越限(如超過5%…

JS手寫代碼篇---手寫Promise

4、手寫promise Promise 是一個內置對象&#xff0c;用于處理異步操作。Promise 對象表示一個尚未完成但預期將來會完成的操作。 Promise 的基本結構 一個 Promise 對象通常有以下狀態&#xff1a; pending&#xff08;進行中&#xff09;&#xff1a;初始狀態&#xff0c;…

我喜歡的vscode幾個插件和主題

主題 Monokaione Monokai Python 語義高光支持 自定義顏色為 self 將 class , def 顏色更改為紅色 為裝飾器修復奇怪的顏色 適用于魔法功能的椂光 Python One Dark 這個主題只在python中效果最好。 我為我個人使用做了這個主題,但任何人都可以使用它。 插件 1.Pylance Pylanc…

【深度學習新浪潮】大模型時代,我們還需要學習傳統機器學習么?

在大模型時代,AI 工程師仍需掌握傳統機器學習知識,這不僅是技術互補的需求,更是應對復雜場景和職業發展的關鍵。以下從必要性和學習路徑兩方面展開分析: 一、傳統機器學習在大模型時代的必要性 技術互補性 大模型(如GPT、BERT)擅長處理復雜語義和生成任務,但在數據量少…

年度工作計劃總結述職報告PPT模版一組分享

工作計劃總結述職報告PPT模版&#xff1a;工作計劃述職報告PPT模版https://pan.quark.cn/s/fba40a5e87da 第一套PPT模版是醫院年度工作計劃的封面頁&#xff0c;有藍橙配色、醫院標題、年度工作計劃的大字、英文副標題、匯報人信息和右上角的醫院logo區域&#xff0c;右側還有醫…

軟件設計師“排序算法”真題考點分析——求三連

一、考點分值占比與趨勢分析 綜合知識題分值統計表 年份考題數量總分值分值占比考察重點2018222.67%時間復雜度/穩定性判斷2019334.00%算法特性對比分析2020222.67%空間復雜度要求2021111.33%算法穩定性判斷2022334.00%綜合特性應用2023222.67%時間復雜度計算2024222.67%分治…

華為云Flexus+DeepSeek征文|基于華為云Flexus云服務的云服務器單機部署Dify-LLM應用開發平臺

目錄 一、前言 二、華為云Flexus云服務優勢 三、華為云Flexus一鍵部署Dify 3.1 選擇模板 3.2 參數配置 3.3 資源棧設置 3.4 配置確認 3.5 創建執行計劃 3.6 部署 四、Dify-LLM應用開發平臺初體驗 4.1 訪問Dify-LLM應用開發平臺 4.2 設置管理員賬戶 4.3 登錄Dify-LLM應用開發平臺…

智能指針RAII

引入&#xff1a;智能指針的意義是什么&#xff1f; RAll是一種利用對象生命周期來控制程序資源&#xff08;如內存、文件句柄、網絡連接、互斥量等等&#xff09;的簡單技術。 在對象構造時獲取資源&#xff0c;接著控制對資源的訪問使之在對象的生命周期內始終保持有效&#…

nt!MiRemovePageByColor函數分析之脫鏈和刷新顏色表

第0部分&#xff1a;背景 PFN_NUMBER FASTCALL MiRemoveZeroPage ( IN ULONG Color ) { ASSERT (Color < MmSecondaryColors); Page FreePagesByColor[Color].Flink; if (Page ! MM_EMPTY_LIST) { // // Remove the first entry on the zeroe…

DEBUG:Lombok 失效

DEBUG&#xff1a;Lombok 失效 問題描述 基于 Spring Boot 的項目中&#xff0c;編譯時顯示找不到 log 屬性。查看對應的 class 類&#xff0c;Lombok 正常在編譯時生成 log 屬性。 同時存在另一個問題&#xff0c;使用Getter注解&#xff0c;但實際使用中該注解并沒有生效&…

3D幾何建模引擎3D ACIS Modeler核心功能深度解讀

3D ACIS Modeler是一款由Spatial Corporation&#xff08;現為Dassault Systmes旗下&#xff09;開發的工業級三維幾何建模內核&#xff0c;為CAD/CAM/CAE、建筑、制造、測量及三維動畫等領域提供底層建模能力。本文將從基本定位、核心功能及行業案例三方面&#xff0c;系統介紹…

Flutter - 集成三方庫:數據庫(sqflite)

數據庫 $ flutter pub add sqlite $ flutter pub get$ flutter run運行失敗&#xff0c;看是編譯報錯,打開Xcode工程 ? B 編譯 對比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默認的Flutter工程默認未生成Pod…

Android 中 權限分類及申請方式

在 Android 中,權限被分為幾個不同的類別,每個類別有不同的申請和管理方式。 一、 普通權限(Normal Permissions) 普通權限通常不會對用戶隱私或設備安全造成太大風險。這些權限在應用安裝時自動授予,無需用戶在運行時手動授權。 android.permission.INTERNETandroid.pe…

目標檢測指標計算

mAP&#xff08;mean Average Precision&#xff09; 概述 預備參數&#xff1a;類別數&#xff0c;IoU閾值&#xff0c;maxDets值&#xff08;每張測試圖像最多保留maxDets個預測框&#xff0c;通常是根據置信度得分排序后取前maxDets個&#xff09;&#xff1b; Q: 假如某張…

聯合索引失效情況分析

一.模擬表結構&#xff1a; 背景&#xff1a; MySQL版本——8.0.37 表結構DDL&#xff1a; CREATE TABLE unite_index_table (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵,clomn_first varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMEN…