一. 回溯
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;
}
};