复制带随机指针的链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。 
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。
每个节点用一个 [val, random_index] 表示:
-----val:一个表示 Node.val 的整数。
-----random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

来源:力扣(LeetCode 138)
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer

//方法1、 哈希
class Solution {
public:
Node* copyRandomList(Node* head){
if(!head)
return nullptr;
map<Node,Node>mp;//原链表节点与对应位置的新链表节点
Node* ptr=head;
while(ptr){
Node* temp=new Node(ptr->val);//新链表节点
mp[ptr]=temp;//建立映射关系
ptr=ptr->next;//遍历
}
ptr=head;
while(ptr){
Node* newNode=mp[ptr];
newNode->next=mp[ptr->next];//根据map连接新链表
newNode->random=mp[ptr->random];
ptr=ptr->next; //遍历原链表
}
//ptr指向链表尾部
return mp[head];//返回首部节点
}
};

//方法2、map+vector
//不推荐
Node* copyRandomList(Node* head) {
map<Node,int>node_M;
vector<Node
>node_V;
int i=0;
Node* ptr=head;

    while(ptr){
        //遍历原始链表
        //Node* temp=new Node(ptr->val);
        node_V.push_back(new Node(ptr->val));//vector中传入新链表
        node_M[ptr]=i;
        ptr=ptr->next;
        ++i;//记录节点位置
    }

    node_V.push_back(0);
    ptr=head;
    i=0;

    while(ptr){
        node_V[i]->next=node_V[i+1];
        if(ptr->random){
            int id=node_M[ptr->random];
            node_V[i]->random=node_V[id];
        }
        ptr=ptr->next;
        ++i;
    }
    return node_V[0];
}
posted @ 2020-11-05 19:45  Colin_Code  阅读(61)  评论(0)    收藏  举报