複製帶隨機指標的連結串列
阿新 • • 發佈:2020-11-05
給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。
要求返回這個連結串列的深拷貝。
我們用一個由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
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
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]; }