一. 回溯
1. 當random訪問了一個新的節點,需要創建它, 否則直接返回舊的指針就好.
2. 特別注意,哈希表中傳入的都是指針,所以一定會是Node*類型,而不是Node.
/*
// 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*類型.
map<Node*, Node*> tmp;
//這個其實是回溯,函數的作用是返回拷貝的節點,
//先遞再歸,先next再random.
Node* copyRandomList(Node* head) {
//遞歸終止條件.
if(head==NULL) return NULL;
if(tmp.count(head)) return tmp[head];
//新建節點,作爲深拷貝,注意是指針.
Node* n = new Node(head->val);
tmp[head] = n;
n->next = copyRandomList(head->next);
n->random = copyRandomList(head->random);
return n;
}
};