首页 > 其他 > 详细

138. 复制带随机指针的链表

时间:2019-11-09 15:40:47      阅读:80      评论:0      收藏:0      [点我收藏+]
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。 
 
示例:
技术分享图片
技术分享图片
 
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
 
提示:
你必须返回给定头的拷贝作为对克隆列表的引用。
 
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 
原链表
技术分享图片
 
 
新链表
技术分享图片
 
技术分享图片
 
 
根据random的地址获得节点位置
 
 
 
 
 
技术分享图片
 
 
 
 
有了节点位置,就可以设置 new_node->random
 
 
 
random指向NULL,new_node->random->NULL
 
 1 class Node {
 2 public:
 3     int val;
 4     Node *next;
 5     Node *random;
 6     
 7     Node(int _val) : val(_val), next(NULL), random(NULL) {}
 8 };
 9 
10 class Solution {
11 public:
12     Node* copyRandomList(Node* head) {
13         map<Node *, int> node_map;//当前节点及其编号的映射
14         vector<Node *> node_vec;
15         Node *ptr = head;
16         
17         int i = 0;
18         while (ptr) { //初始化
19             node_vec.push_back(new Node(ptr->val));
20             node_map[ptr] = i;
21             ptr = ptr->next;
22             ++i;
23         }
24         node_vec.push_back(0);
25         
26         ptr = head;
27         i = 0;
28         while (ptr) {
29             node_vec[i]->next = node_vec[i+1];
30             if (ptr->random) {
31                 int id = node_map[ptr->random];
32                 node_vec[i]->random = node_vec[id];
33             } else {
34                 node_vec[i]->random = NULL;
35             }
36             ptr = ptr->next;
37             ++i;
38         }
39         return node_vec[0];
40     }
41 };

 

测试

技术分享图片
 1 int main(int argc, const char * argv[]) {
 2     Node a(1);
 3     Node b(2);
 4     Node c(3);
 5     Node d(4);
 6     Node e(5);
 7     a.next = &b;
 8     b.next = &c;
 9     c.next = &d;
10     d.next = &e;
11     a.random = &c;
12     b.random = &d;
13     c.random = &c;
14     e.random = &d;
15     
16     Solution solve;
17     Node *head = solve.copyRandomList(&a);
18     while (head) {
19         cout <<"head->val:" <<head->val << ;
20         if (head->random) {
21             cout <<"head->random->val:" <<head->random->val <<endl;
22         } else {
23             cout <<"head->random->NULL" <<endl;
24         }
25         head = head->next;
26     }
27 
28     return 0;
29 }
View Code

 

138. 复制带随机指针的链表

原文:https://www.cnblogs.com/i-8023-/p/11826150.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!