复制这种复杂链表,需要两次遍历和一个哈希表
第一次遍历将next指针穿起来,并将原链表和新链表的映射关系保存在哈希中
第二次遍历通过操纵哈希表来建立random指针的随机指向问题
代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if( head == NULL ){
return head;
}
unordered_map< Node*,Node* > map;
Node* newhead = new Node( head->val );
map[head] = newhead;
auto pre = newhead;
for(auto it = head->next ; it!=NULL ; it = it->next ){
Node* cur = new Node( it->val );
map[it] = cur;
pre->next = cur;
pre = cur;
}
for(auto it = head ; it!=NULL ; it = it->next ){
map[it]->random = map[it->random];
}
return newhead;
}
};