题解 | #复杂链表的复制#
复杂链表的复制
http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
复杂链表的复制
利用哈希表记录原节点和复制链表节点间映射(通过原节点直接找到对应的复制节点),
- 先建立next链表(不含random指向)
- 通过哈希表(遍历哈希表),根据原节点的random指向(有原节点和复制节点的映射)直接得到复制节点的random指向。
如图:建立好next指向的复制链表后,遍历哈希表。
原节点4的random指向2, 复制节点指向复制节点的2(即 m[4->random] ),因为原2节点和复制节点2映射。
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(!pHead)return NULL;
unordered_map<RandomListNode*,RandomListNode*> m;
RandomListNode* head = pHead->next,*hclone = new RandomListNode(pHead->label),*he = hclone;
m[pHead] = hclone;
while(head){
RandomListNode* clone = new RandomListNode(head->label);
m[head] = clone;//节点和复制节点的映射。
hclone->next = clone;
hclone = hclone->next;
head = head->next;
}
for(auto &[key,value] : m){
value->random = (key->random == NULL ? NULL : m[key->random]);
}
return he;
}
};