1. 程式人生 > 實用技巧 >複製帶隨機指標的連結串列

複製帶隨機指標的連結串列

給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。
要求返回這個連結串列的深拷貝。
我們用一個由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){
mp[ptr]=new Node(ptr->val);//key值為原連結串列指標,value為copy
ptr=ptr->next;
}
ptr=head;
while(ptr){
mp[ptr]->next=mp[ptr->next];//next連線
mp[ptr]->random=mp[ptr->random];//random連線
ptr=ptr->next;
}
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];
}