- 题目描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
- 题解
参考链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/
1. 时间O(N),空间O(N)
2. 时间O(N),空间O(1)
3. 时间O(N),空间O(N)
- 代码
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head) return NULL;
map<Node*,Node*> mymap;
Node* p=head;
while (p){
Node* tmp=new Node(0);
mymap[p]=tmp;
p=p->next;
}
for (auto m:mymap){
m.second->val=m.first->val;
m.second->random=mymap[m.first->random];
m.second->next=mymap[m.first->next];
}
return mymap[head];
}
};
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head) return NULL;
Node* p=head;
while (p){
Node* tmp=new Node(p->val);
tmp->next=p->next;
p->next=tmp;
p=tmp->next;
}
p=head;
while (p){
if (p->random) p->next->random=p->random->next;
else p->next->random=NULL;
p=p->next->next;
}
Node* node=new Node(-1),*q=node;
p=head;
while (p){
q->next=p->next;
q=q->next;
p->next=q->next;
p=p->next;
}
return node->next;
}
};
- 说明
1. 我们可以使用哈希表,建立链表中每个节点与深拷贝之后相应节点之间的映射关系,之后为其赋值,val
的值相等,next的值即为原链表next节点在map中的对应节点,random的值也为原链表random节点在map中
的对应节点。
2. 我们可以不必使用哈希表来建立映射关系,在原链表中的每个节点后插入和其值相同的节点,这样相邻两个
节点就建立了对应关系,节点的random值为其原节点random的next节点,最后再把拷贝之后的链表抽出来即
可。
3. 将其视作图来进行深度优先搜索。