[LeetCode]Copy List with Random Pointer
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.
思考:先进行单链表复制,在定义random指针,每个结点的random指针都要遍历一次链表,时间复杂度为O(n2)。
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: RandomListNode *copyList(RandomListNode *head) { if(head==NULL) return head; RandomListNode *newhead=NULL; RandomListNode *p=head; RandomListNode *q=newhead; while(p) { RandomListNode *node=new RandomListNode(NULL); node->label=p->label; if(newhead==NULL) { newhead=node; q=node; } else { q->next=node; q=q->next; } p=p->next; } return newhead; } void copyRandomPointer(RandomListNode *head,RandomListNode *newhead) { if(head==NULL||newhead==NULL) return; RandomListNode *p=head; RandomListNode *q=newhead; RandomListNode *a,*b; while(p) { if(p->random==NULL) q->random==NULL; else { a=head;b=newhead; while(p->random!=a) { a=a->next; b=b->next; } q->random=b; } p=p->next; q=q->next; } } RandomListNode *copyRandomList(RandomListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head==NULL) return head; RandomListNode *newhead=copyList(head); copyRandomPointer(head,newhead); return newhead; } };
上述方法,时间都耗费在寻找random指针上。怎样在O(1)时间里找到random指向结点,是本题需要精髓所在。参考这里。
/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { * int label; * RandomListNode *next, *random; * RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */ class Solution { public: void CloneNodes(RandomListNode *head) { RandomListNode *p=head; while(p) { RandomListNode *node=new RandomListNode(p->label); node->next=p->next; p->next=node; p=node->next; } } void CopyRandomPointer(RandomListNode *head) { RandomListNode *p=head; while(p) { if(p->random==NULL) p->next->random=NULL; else p->next->random=p->random->next; p=p->next->next; } } RandomListNode *SeparateList(RandomListNode *head) { RandomListNode *p=head; RandomListNode *newhead=NULL; RandomListNode *q=newhead; while(p) { if(newhead==NULL) { newhead=q=p->next; p->next=q->next; p=p->next; } else { q->next=p->next; q=q->next; p->next=q->next; p=p->next; } } return newhead; } RandomListNode *copyRandomList(RandomListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head==NULL) return head; CloneNodes(head); CopyRandomPointer(head); return SeparateList(head); } };
总感觉百度后好像失去了什么。。学习解题思路,而不是解题方法,切记!