1.タイトルの説明
リンクリストを指定すると、各ノードには追加のランダムポインターが含まれ、リンクリスト内の任意のノードまたは空のノードを指すことができます。
このリンクリストのディープコピーを返すように要求します。
n個のノードで構成されるリンクリストを使用して、入力/出力のリンクリストを表します。各ノードは[val、random_index]で表されます。
- val:Node.valを表す整数。
- random_index:ランダムポインタが指すノードのインデックス(0からn-1の範囲)。どのノードも指していない場合はnullです。
例1:
入力:head = [[7、null]、[13,0]、[11,4]、[10,2]、[1,0]]
出力:[[7、null]、[13,0]、 [11,4]、[10,2]、[1,0]]
例2:
入力:head = [[1,1]、[2,1]]
出力:[[1,1]、[2,1]]
例3:
入力:head = [[3、null]、[3,0]、[3、null]]
出力:[[3、null]、[3,0]、[3、null]]
例4:
入力:head = []
出力:[]
説明:指定されたリンクリストは空(nullポインター)であるため、nullが返されます。
促す:
- -10000 <= Node.val <= 10000
- Node.randomが空(null)であるか、リンクリスト内のノードを指しています。
- ノードの数は1000を超えません。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
//to do
}
};
2つの問題解決のアイデア
-
ハッシュグラフを使用して、最初に元のリンクリストと同じ数のノードを生成します
unordered_map<Node*,Node*>nodemap; nodemap[nullptr]=nullptr; Node* p=head; while(p){ nodemap[p]=new Node(p->val); p=p->next; }
-
ハッシュグラフの各ノードを元のノードと同じにします
p=head; while(p!=nullptr){ nodemap[p]->next=nodemap[p->next]; p=p->next; }
-
ランダムポインタをコピーする
p=head; while(p!=nullptr){ nodemap[p]->random=nodemap[p->random]; p=p->next; }
三、私のコード
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
unordered_map<Node*,Node*>nodemap;
nodemap[nullptr]=nullptr;
Node* p=head;
while(p!=nullptr){
nodemap[p]=new Node(p->val);
p=p->next;
}
p=head;
while(p!=nullptr){
nodemap[p]->next=nodemap[p->next];
p=p->next;
}
p=head;
while(p!=nullptr){
nodemap[p]->random=nodemap[p->random];
p=p->next;
}
return nodemap[head];
}
};