复杂链表的复制的难点就是如何把random节点的复制出来,正常链表的复制就是遍历链表,复制节点,但是这里有乱序节点,有可能当指针指向时还未生成该链表,所以可以用哈希表来存储节点,第一次遍历链表,将每个节点放入哈希表,同时,存入一个新的节点new Node(cur->val),此时他作为value值只是一个单节点,没有next也没有random,而原来cur作为key,这里没一个节点包含一个完整的链表结构,拥有他的next和random,第一次遍历相当于,图1,构建原链表和新未连接的链表节点,第二次遍历,就是通过哈希表查询让新链表节点和新链表节点相连接,map[cur]指的是新链表节点此时的next和random为空,通过map[cur->next]可以找到哈希表中存的所要连接的另外一个新链表节点,通过
map[cur]->next=map[cur->next];
map[cur]->random=map[cur->random];
来重新连接。因为map[cur]和map[cur->next]这两个的key值是完整的Node。
Node* copyRandomList(Node* head) {
if(head==NULL) return {};
Node *cur=head;
unordered_map<Node*,Node*>map;
while(cur!=NULL)
{
map[cur]= new Node(cur->val);
cur=cur->next;
}
cur=head;
while(cur!=NULL)
{
map[cur]->next=map[cur->next];
map[cur]->random=map[cur->random];
cur=cur->next;
}
return map[head];
}