碼迷,mamicode.com
首頁 > 其他好文 > 詳細

劍指offer-復雜鏈表的復制

時間:2021-07-29 16:17:40      閱讀:0      評論:0      收藏:0      [點我收藏+]

標簽:val   div   直接   nod   映射   off   另一個   tail   ima   

描述

輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針random指向一個隨機節點),請對此鏈表進行深拷貝,并返回拷貝后的頭結點。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)。 下圖是一個含有5個結點的復雜鏈表。圖中實線箭頭表示next指針,虛線箭頭表示random指針。為簡單起見,指向null的指針沒有畫出。
技術圖片

 

 

求解思路:

  1. 第一個循環先構建非隨機鏈(即只考慮next指針),并用map記錄label與新鏈表各節點的映射
  2. 第二個循環根據map,完善隨機指針。

代碼:

 

 1 /*
 2 struct RandomListNode {
 3     int label;
 4     struct RandomListNode *next, *random;
 5     RandomListNode(int x) :
 6             label(x), next(NULL), random(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     RandomListNode* Clone(RandomListNode* pHead) {
13         //  如果把復雜鏈表看作隨機鏈和非隨機鏈,那先確定非隨機鏈
14         // 然后依次檢驗每個節點的隨機指針,讀取val,通過val確定新鏈的隨機指針
15         // 改進:在構建非隨機鏈表時,新建map映射 val和random(這里記錄節點)
16         std::map<int,RandomListNode*> lm;
17         RandomListNode* newHead=NULL;
18         RandomListNode* tail;   // 記錄尾節點
19         // 完成非隨機鏈表的構建
20         RandomListNode* ergNode=pHead;
21         while(ergNode!=nullptr){
22             RandomListNode* rn=new RandomListNode(ergNode->label);
23             if(newHead==nullptr){
24                 newHead=rn;
25             }else{
26                 tail->next=rn;
27             }
28             tail=rn;
29             // 構建label和node的映射
30             // lm.insert(pair<int,RandomListNode*>(rn->label,rn));
31             lm[rn->label]=rn;
32             ergNode=ergNode->next;
33         }
34         // 再用一個循環完成隨機鏈表的構建
35         ergNode=pHead;  // 遍歷原有鏈表
36         RandomListNode* repNode=newHead;  // 補充現有鏈表
37         while(ergNode!=nullptr){
38             if(ergNode->random!=nullptr){
39                 repNode->random=lm[ergNode->random->label];
40                 int f=1;
41             }
42             ergNode=ergNode->next;
43             repNode=repNode->next;
44         }
45         return newHead;
46     }
47 };

 

 

 

劍指offer-復雜鏈表的復制

標簽:val   div   直接   nod   映射   off   另一個   tail   ima   

原文地址:https://www.cnblogs.com/zgll/p/15072949.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 mamicode.com 版權所有  聯系我們:gaon5@hotmail.com
迷上了代碼!
4399在线看MV_久久99精品久久久久久久久久_成人又黄又爽又刺激视频_能收黄台的app不收费