标签:style blog io color sp for div on log
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
要复制一个链表,但是要做到深度复制,如果每个链表节点中只有一个next指针的话会很容易,直接从前往后复制就行了。但是这个神奇的链表节点中有random pointer,如果采取从前往后复制的方法,可能random pointer对应的节点还没有生成,这时无法进行赋值了。可以采取这种策略,利用map key-value对 的性质,先将新生成的链表结点的random pointer指向老结点中的random pointer值。每生成一个新节点,就把新老节点的对应key-value对 存入map。等新链表的主体部分生成完毕,再利用map将新链表结点中的random pointer指向新生成的结点。
思路很简单,实现也比较容易,直接上代码了!
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) 13 return NULL; 14 unordered_map<RandomListNode *,RandomListNode * > map; 15 RandomListNode *tmp=NULL; 16 RandomListNode *h; 17 while(head){ 18 if(tmp==NULL){ 19 tmp=new RandomListNode(head->label); 20 tmp->random=head->random; 21 h=tmp; 22 } 23 else{ 24 tmp->next=new RandomListNode(head->label); 25 tmp=tmp->next; 26 tmp->random=head->random; 27 } 28 map.insert(pair<RandomListNode *,RandomListNode *>(head,tmp)); 29 head=head->next; 30 } 31 tmp=h; 32 while(tmp){ 33 tmp->random=map[tmp->random]; 34 tmp=tmp->next; 35 } 36 return h; 37 } 38 };
Copy List with Random Pointer (16)
标签:style blog io color sp for div on log
原文地址:http://www.cnblogs.com/zhoudayang/p/4098174.html