标签: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