標簽:val div 直接 nod 映射 off 另一個 tail ima
求解思路:
代碼:
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 };
標簽:val div 直接 nod 映射 off 另一個 tail ima
原文地址:https://www.cnblogs.com/zgll/p/15072949.html