没懂题目的用意,看了网上求解。主要问题在于复制时我们一般是一个节点一个节点复制的,但对于随机节点有可能复制时,那个节点还没创建!!所以应如何对乱序的指向进行复制??
暴力解决是,先创建好所有节点,然后都每个节点的随机指向都循环一次链表,直到找到乱序指向的那个节点,进行复制连接!!!时间复杂度很高!!
比较经典的做法是第一次循环在每个节点后插入一个复制的节点,第二次循环时可以将对应的 乱序指向 进行复制连接到新创建节点(肯定就在原节点后的一个节点),第三遍循环就可以隔点将新节点依次串起来!
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 };