網站首頁 編程語言 正文
一、題目描述
請實現 copyRandomList 函數,復制一個復雜鏈表。在復雜鏈表中,每個節點除了有一個 next 指針指向下一個節點,還有一個 random 指針指向鏈表中的任意節點或者 null。
示例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]]
示例4:
輸入:head = []
輸出:[]
解釋:給定的鏈表為空(空指針),因此返回 null。
提示:
-10000 <= Node.val <= 10000
Node.random 為空(null)或指向鏈表中的節點。
節點數目不超過 1000 。
二、思路分析
注:思路分析中的一些內容和圖片參考自力扣各位前輩的題解,感謝他們的無私奉獻
分析
復制普通鏈表:給定鏈表的頭結點head,復制普通鏈表很簡單,只需遍歷鏈表,每輪需要:建立新結點 + 讓前驅結點的next指向當前這個新結點 + 讓當前這個新結點的next指向空
復制復雜鏈表:本題鏈表的結點新增了 random 指針,指向鏈表中的任意結點或者null。這個 random 指針意味著在復制過程中,除了構建前驅結點的next指針,還要構建前驅結點的ramdom指針。因此,每輪需要:建立2個新結點 + 讓前驅結點的next指向第1個新結點 + 讓前驅結點的random指向第2個新結點。但是這有一個問題:并不是每次都需要建立2個新結點。有時候前驅結點的random指向的是已經存在的結點,但是如何判斷出來呢?如果把所有結點遍歷一遍,那就太麻煩了。
思路
利用哈希表的查詢特點,考慮構建原鏈表結點和新鏈表對應結點的鍵值對映射關系,再遍歷構建新鏈表各結點的next和random引用指向即可。
?
算法流程:
①若頭節點head
為空結點,直接返回NULL
?;
②初始化:聲明一個哈希表dic
,定義一個結點cur
指向頭結點,這個cur
控制后面的循環
③建立哈希映射:遍歷這個鏈表,每個鏈表結點對應建立一個新結點,并向dic
添加鍵值對(原cur結點, 新cur結點)
④構建新鏈表的引用指向:構建新結點的next
和random
引用指向
⑤返回值: 返回新鏈表的頭結點,即dic[cur]
三、整體代碼
/* // 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) { //若是空鏈表,則返回NULL if(head == NULL) return NULL; //創建一個結點,指向這個鏈表的頭結點。這個結點用來控制后面的循環 Node* cur = head; //創建一個哈希表 unordered_map<Node*, Node*> map; while(cur != NULL){ //為鏈表每個結點創建一個對應的新結點,并建立原結點和新結點的Map映射 map[cur] = new Node(cur->val); cur = cur->next; } cur = head; //為新鏈表每個結點的next和random設置對應的指向 while(cur != NULL){ map[cur]->next = map[cur->next]; map[cur]->random = map[cur->random]; cur = cur->next; } //返回新鏈表的頭結點 return map[head]; } };
總結
原文鏈接:https://blog.csdn.net/InnerPeaceHQ/article/details/122971715
相關推薦
- 2023-01-19 GO語言的數組array與切片slice詳解_Golang
- 2023-03-11 C/C++?-?從代碼到可執行程序的過程詳解_C 語言
- 2022-11-09 Oracle如何在SQL語句中對時間操作、運算_oracle
- 2022-05-07 react中的雙向綁定你真的了解嗎_React
- 2022-11-27 Python?ORM數據庫框架Sqlalchemy的使用教程詳解_python
- 2023-01-26 Python中的lambda和apply用法及說明_python
- 2023-05-21 Django項目搭建之實現簡單的API訪問_python
- 2022-09-29 React函數組件useContext?useReducer自定義hooks_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支