码迷,mamicode.com
首页 > 其他好文 > 详细

Copy List with Random Pointer

时间:2015-10-19 22:13:46      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

没懂题目的用意,看了网上求解。主要问题在于复制时我们一般是一个节点一个节点复制的,但对于随机节点有可能复制时,那个节点还没创建!!所以应如何对乱序的指向进行复制??

暴力解决是,先创建好所有节点,然后都每个节点的随机指向都循环一次链表,直到找到乱序指向的那个节点,进行复制连接!!!时间复杂度很高!!

比较经典的做法是第一次循环在每个节点后插入一个复制的节点,第二次循环时可以将对应的 乱序指向 进行复制连接到新创建节点(肯定就在原节点后的一个节点),第三遍循环就可以隔点将新节点依次串起来!

 1 /**
 2  * Definition for singly-linked list with a random pointer.
 3  * struct RandomListNode {
 4  *     int label;
 5  *     RandomListNode *next, *random;
 6  *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     RandomListNode *copyRandomList(RandomListNode *head) {
12        if(head==NULL) return head;
13         RandomListNode *p;
14         p=head;
15         while(p)
16         {
17             RandomListNode *copy=new RandomListNode(p->label);
18             copy->next=p->next;
19             p->next=copy;
20             
21             p=p->next->next;
22         }
23         p=head;
24         while(p)
25         {
26             if(p->random==NULL)p->next->random=NULL;
27             else p->next->random=p->random->next;
28             p=p->next->next;
29         }
30         RandomListNode node(0);
31         //node.next=head->next;
32         p=&node;
33         while(head)
34         {
35             p->next=head->next;
36             head->next=head->next->next;
37             head=head->next;
38             p=p->next;
39             
40         }
41         return node.next;
42     }
43 };

 

Copy List with Random Pointer

标签:

原文地址:http://www.cnblogs.com/daocaorenblog/p/4893047.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!