力扣138.隨機鏈表的復制

給你一個長度為?n?的鏈表,每個節點包含一個額外增加的隨機指針?random?,該指針可以指向鏈表中的任何節點或空節點。

構造這個鏈表的?深拷貝。?深拷貝應該正好由?n?個?全新?節點組成,其中每個新節點的值都設為其對應的原節點的值。新節點的?next?指針和?random?指針也都應指向復制鏈表中的新節點,并使原鏈表和復制鏈表中的這些指針能夠表示相同的鏈表狀態。復制鏈表中的指針都不應指向原鏈表中的節點?

例如,如果原鏈表中有?X?和?Y?兩個節點,其中?X.random --> Y?。那么在復制鏈表中對應的兩個節點?x?和?y?,同樣有?x.random --> y?。

返回復制鏈表的頭節點。

用一個由?n?個節點組成的鏈表來表示輸入/輸出中的鏈表。每個節點用一個?[val, random_index]?表示:

  • val:一個表示?Node.val?的整數。
  • random_index:隨機指針指向的節點索引(范圍從?0?到?n-1);如果不指向任何節點,則為??null?。

你的代碼??接受原鏈表的頭節點?head?作為傳入參數。

示例 1:

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]

示例 3:

輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]
/*
// 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: unordered_map<Node* ,Node*>cacheNnode;Node* copyRandomList(Node* head) {if(head==nullptr){return nullptr;}if(!cacheNnode.count(head)){Node*headNew=new Node(head->val);cacheNnode[head]=headNew;headNew->next=copyRandomList(head->next);headNew->random=copyRandomList(head->random);}return cacheNnode[head];}
};

對一個特殊的鏈表進行深拷貝。如果是普通鏈表,我們可以直接按照遍歷的順序創建鏈表節點。而本題中因為隨機指針的存在,當我們拷貝節點時,「當前節點的隨機指針指向的節點」可能還沒創建,因此我們需要變換思路。一個可行方案是,我們利用回溯的方式,讓每個節點的拷貝操作相互獨立。對于當前節點,我們首先要進行拷貝,然后我們進行「當前節點的后繼節點」和「當前節點的隨機指針指向的節點」拷貝,拷貝完成后將創建的新節點的指針返回,即可完成當前節點的兩指針的賦值。

具體地,我們用哈希表記錄每一個節點對應新節點的創建情況。遍歷該鏈表的過程中,我們檢查「當前節點的后繼節點」和「當前節點的隨機指針指向的節點」的創建情況。如果這兩個節點中的任何一個節點的新節點沒有被創建,我們都立刻遞歸地進行創建。當我們拷貝完成,回溯到當前層時,我們即可完成當前節點的指針賦值。注意一個節點可能被多個其他節點指向,因此我們可能遞歸地多次嘗試拷貝某個節點,為了防止重復拷貝,我們需要首先檢查當前節點是否被拷貝過,如果已經拷貝過,我們可以直接從哈希表中取出拷貝后的節點的指針并返回即可。

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

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

相關文章

編寫一個自動合并代碼到不同分支的腳本小工具

新建一個 autoMerge.sh 的文件&#xff0c;文件內容如下 # 提示用戶確認繼續執行 read -p "確認要執行腳本嗎&#xff1f;(輸入 yes 繼續): " userInput# 檢查用戶輸入是否為 "yes" if [ "$userInput" ! "yes" ]; thenecho "用戶…

《TCP/IP詳解 卷一》第9章 廣播和組播

目錄 9.1 引言 9.2 廣播 9.2.1 使用廣播地址 9.2.2 發送廣播數據報 9.3 組播 9.3.1 將組播IP地址轉換為組播MAC地址 9.3.2 例子 9.3.3 發送組播數據報 9.3.4 接收組播數據報 9.3.5 主機地址過濾 9.4 IGMP協議和MLD協議 9.4.1 組成員的IGMP和MLD處理 9.4.2 組播路由…

可用于智能客服的完全開源免費商用的知識庫項目

介紹 FastWiki項目是一個高性能、基于最新技術棧的知識庫系統&#xff0c;專為大規模信息檢索和智能搜索設計。利用微軟Semantic Kernel進行深度學習和自然語言處理&#xff0c;結合.NET 8和MasaBlazor前端框架&#xff0c;后臺采用.NET 8MasaFrameworkSemanticKernel&#xff…

嵌入式Linux學習DAY26

管道的作用&#xff1a;進程間的通信 無名管道&#xff1a; 只能在父子進程中進行通信 pipe int pipe(int pipefd[2]); 功能: 創建一個無名管道 參數: pipefd[0]:讀管道文件描述符 pipefd[1]:寫管道文件描述符 …

【InternLM 實戰營筆記】基于 InternLM 和 LangChain 搭建MindSpore知識庫

InternLM 模型部署 準備環境 拷貝環境 /root/share/install_conda_env_internlm_base.sh InternLM激活環境 conda activate InternLM安裝依賴 # 升級pip python -m pip install --upgrade pippip install modelscope1.9.5 pip install transformers4.35.2 pip install str…

【大廠AI課學習筆記NO.53】2.3深度學習開發任務實例(6)數據采集

這個系列寫了53期了&#xff0c;很多朋友收藏&#xff0c;看來還是覺得有用。 后續我會把相關的內容&#xff0c;再次整理&#xff0c;做成一個人工智能專輯。 今天學習到了數據采集的環節。 這里有個問題&#xff0c;數據準備包括什么&#xff0c;還記得嗎&#xff1f; 數…

ZStack Cube超融合入選IDC《中國超融合基礎架構市場評估》報告

近日&#xff0c;IDC發布了《中國超融合基礎架構市場評估&#xff0c;2023》。IDC針對中國超融合基礎架構市場的發展現狀展開了調研&#xff0c;明確了最終用戶構建融合型云平臺的痛點和難點&#xff0c;闡述了市場中各技術服務提供商的服務方案和優勢&#xff0c;并對未來中國…

vue3+ts+vite數據大屏自適應總結(兩種方法)

總結一下我常用的數據大屏自適應方法 目錄 1、通過css縮放方案&#xff1a; 利用transform&#xff1a;scale 進行適配2、采用rem布局&#xff0c; 根據屏幕分辨率大小不同&#xff0c;調整根元素html的font-size&#xff0c; 從而達到每個元素寬高自動變化&#xff0c;適配不…

接口測試實戰--mock測試、日志模塊

一、mock測試 在前后端分離項目中,當后端工程師還沒有完成接口開發的時候,前端開發工程師利用Mock技術,自己用mock技術先調用一個虛擬的接口,模擬接口返回的數據,來完成前端頁面的開發。 接口測試和前端開發有一個共同點,就是都需要用到后端工程師提供的接口。所以,當…

Redis速學

一、介紹Redis 基本概念和特點 Redis是一個開源的內存數據庫&#xff0c;它主要用于數據緩存和持久化。其數據存儲在內存中&#xff0c;這使得它具有非常快的讀寫速度。Redis支持多種數據結構&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;這使得它非常靈活…

書生·浦語大模型圖文對話Demo搭建

前言 本節我們先來搭建幾個Demo來感受一下書生浦語大模型 InternLM-Chat-7B 智能對話 Demo 我們將使用 InternStudio 中的 A100(1/4) 機器和 InternLM-Chat-7B 模型部署一個智能對話 Demo 環境準備 在 InternStudio 平臺中選擇 A100(1/4) 的配置&#xff0c;如下圖所示鏡像…

微店商品詳情 API 支持哪些商品信息的獲取?

微店&#xff08;Weidian&#xff09;并沒有一個公開的、官方維護的API文檔來供開發者使用。這意味著&#xff0c;如果你想要獲取微店商品詳情或其他相關信息&#xff0c;你通常需要通過微店官方提供的方式來實現&#xff0c;例如使用其開放平臺、官方SDK或聯系微店的技術支持獲…

Spring常見面試題知識點總結(三)

7. Spring MVC&#xff1a; MVC架構的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一種軟件設計模式&#xff0c;旨在將應用程序分為三個主要組成部分&#xff0c;以實現更好的代碼組織、可維護性和可擴展性。每個組件有著不同的職責&#xff0c;相互之間解耦…

11.Prometheus常見PromeQL表達式

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識&#xff0c;帶你從懵懂少年走向人生巔峰&#xff0c;迎娶白富美&#xff01; 關注微信公眾號【 IT特靠譜 】&#xff0c;每天都會分享技術心得~ …

YOLO算法

YOLO介紹 YOLO&#xff0c;全稱為You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一種實時目標檢測算法。目標檢測是計算機視覺領域的一個重要任務&#xff0c;它不僅需要識別圖像中的物體類別&#xff0c;還需要確定它們的位置。與分類任務只關注對…

【矩陣】【方向】【素數】3044 出現頻率最高的素數

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 素數 矩陣 方向 LeetCode 3044 出現頻率最高的素數 給你一個大小為 m x n 、下標從 0 開始的二維矩陣 mat 。在每個單元格&#xff0c;你可以按以下方式生成數字&#xff1a; 最多有 8 條路徑可以選擇&#xff1a;東&am…

安裝 Ubuntu 22.04.3 和 docker

文章目錄 一、安裝 Ubuntu 22.04.31. 簡介2. 下載地址3. 系統安裝4. 系統配置 二、安裝 Docker1. 安裝 docker2. 安裝 docker compose3. 配置 docker 一、安裝 Ubuntu 22.04.3 1. 簡介 Ubuntu 22.04.3 是Linux操作系統的一個版本。LTS 版本支持周期到2032年。 系統要求雙核 C…

C++的模板template

一、什么是模板 C中的模板分為類模板和函數模板&#xff0c;并不是一個實際的類或函數&#xff0c;這指的是編譯器不會自動為其生成具體的可執行代碼。只有在具體執行時&#xff0c;編譯器才幫助其實例化。 二、為什么引入模板 拿我們最常見的交換函數來舉例子&#xff0c;如果…

代碼隨想錄 二叉樹第二周

目錄 101.對稱二叉樹 100.相同的樹 572.另一棵樹的子樹 104.二叉樹的最大深度 559.N叉樹的最大深度 111.二叉樹的最小深度 222.完全二叉樹的節點個數 110.平衡二叉樹 257.二叉樹的所有路徑 101.對稱二叉樹 101. 對稱二叉樹 已解答 簡單 相關標簽 相關企業 給你一…

《求生之路2》服務器如何選擇合適的內存和CPU核心數,以避免丟包和延遲高?

根據求生之路2服務器的實際案例分析選擇合適的內存和CPU核心數以避免丟包和延遲高的問題&#xff0c;首先需要考慮游戲的類型和對服務器配置的具體要求。《求生之路2》作為一款多人在線射擊游戲&#xff0c;其服務器和網絡優化對于玩家體驗至關重要。 首先&#xff0c;考慮到游…