美文网首页LeeCode题目笔记
2019-11-08 复制带随机指针的链表

2019-11-08 复制带随机指针的链表

作者: Antrn | 来源:发表于2019-11-08 22:40 被阅读0次

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深拷贝

示例:

image

输入: {"id":"1","next":{"id":"2","next":null,"random":{"ref":"2"},"val":2},"random":{"ref":"2"},"val":1}

解释: 节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

提示:

  1. 你必须返回给定头的拷贝作为对克隆列表的引用。
C++1

使用两次遍历+hash表。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;

    Node() {}

    Node(int _val, Node* _next, Node* _random) {
        val = _val;
        next = _next;
        random = _random;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        unordered_map<Node*, Node *> nodemap;
        Node *temp = head;
        Node *new_head = new Node(0,NULL,NULL);
        Node *copy_temp = new_head;
        
        while(temp){
            copy_temp->next = new Node(temp->val,NULL,NULL);
            nodemap[temp] = copy_temp->next;
            
            temp = temp->next;
            copy_temp = copy_temp->next;
        }
        
        Node * random_temp = NULL;
        temp = head;
        copy_temp = new_head->next;
        
        while(temp){
            random_temp = temp->random;
            if(random_temp){
                copy_temp->random = nodemap[random_temp];
            }else{
                copy_temp->random = NULL;
            }
            temp = temp->next;
            copy_temp = copy_temp->next;
        }
        
        return new_head->next;
    }
};

相关文章

网友评论

    本文标题:2019-11-08 复制带随机指针的链表

    本文链接:https://www.haomeiwen.com/subject/gtqgbctx.html