[Leetcode] Copy list with random pointer 对带有任意指针的链表深度拷贝
2017-06-14 16:19
585 查看
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 pointer属性。所以有点懵,大神的做法如下,加入个人理解。
思路:对链表进行三次遍历。
第一次遍历复制每一个结点,将新结点接在原结点的后面, 让链表变成一个重复链表,新旧交替;
第二次遍历维护新结点的随机指针,因,新结点是在旧结点之后,所以node->next->random=node->random->next,而node->node结点为新结点,这样,我们就把新结点的随机指针接好了;
第三次遍历,将两新旧结点分开,因为,构成的重复链表是新旧结点交替出现,故,只要每隔一个节点相连即可,就完成了对链表的分割。如下图:
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 { 13 if(head==NULL) return NULL; 14 15 //第一步,在oldNode的后面插入一个新的结点 16 RandomListNode *oldNode=head; 17 while(oldNode !=NULL) 18 { 19 RandomListNode *newNode=new RandomListNode(oldNode->label); 20 newNode->next=oldNode->next; 21 newNode->random=oldNode->random; 22 oldNode->next=newNode; 23 oldNode=newNode->next; //遍历前行 24 } 25 26 //第二步,关联random 27 oldNode=head; 28 while(oldNode !=NULL) 29 { 30 if(oldNode->random !=NULL) 31 oldNode->next->random=oldNode->random->next; 32 oldNode=oldNode->next->next; 33 } 34 35 //第三步,分开两链表 36 RandomListNode *newList=new RandomListNode(0); 37 newList->next=head; 38 RandomListNode *pHead=newList; 39 40 oldNode=head; 41 while(oldNode !=NULL) 42 { 43 pHead->next=oldNode->next; 44 oldNode->next=pHead->next->next; 45 46 pHead=pHead->next; 47 oldNode=oldNode->next; 48 } 49 50 return newList->next; 51 } 52 };
相关文章推荐
- [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
- LeetCode138 Copy List with Random Pointer(深度复制带有随机指针的链表) Java题解
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
- (不会)[LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
- 附有随机结点指针的链表的深度拷贝 Copy List with Random Pointer
- 【LeetCode-面试算法经典-Java实现】【138-Copy List with Random Pointer(拷贝有随机指针的单链表)】
- LeetCode | Copy List with Random Pointer(赋值带有随机指针的链表)
- Copy List with Random Pointer复制带有随机指针的链表
- Leetcode Copy List with Random Pointer 拷贝链表
- LeetCode之复制有random指针的链表Copy List with Random Pointer
- Copy List with Random Pointer 复制有随机指针的链表@LeetCode
- 【LeetCode-面试算法经典-Java实现】【143-Copy List with Random Pointer(有随机指针的链表复制)】
- LeetCode(Copy List with Random Pointer) 复杂链表的深拷贝
- LeetCode——Copy List with Random Pointer(带random引用的单链表深拷贝)
- LeetCode----Copy List with Random Pointer 深度拷贝,浅度拷贝,Lazy拷贝解析
- [LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制
- [LintCode] 复制带随机指针的链表 Copy List with Random Pointer
- Copy List with Random Pointer 深度拷贝,浅度拷贝,Lazy拷贝解析
- [LeetCode]Copy List with Random Pointer &Clone Graph 复杂链表的复制&图的复制
- LeetCode刷题笔记(链表):copy-list-with-random-pointer