给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。
题目来源:https://leetcode-cn.com/problems/copy-list-with-random-pointer/submissions/
解题过程
注意
- 结点之间的连接和关系
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
copyNode(head);
copyRandom(head);
//分离链表
Node* src=head;
Node* deshead=NULL;
Node* des=NULL;
if(src!=NULL)
{
deshead=src->next;
des=src->next;
src->next=des->next;
src=src->next;
}
while(src != NULL)
{
des->next=src->next;
des=des->next;
src->next=des->next;
src=src->next;
}
return deshead;
}
//复制结点
void copyNode(Node* head)
{
Node* src=head;
while(src != NULL)
{
Node* des=new Node();
des->val=src->val;//复制源节点的值
des->next=src->next;//复制源节点的next指针
des->random=NULL;
src->next=des;//等号左右值不要写反了, 如果写成des=src->next,意思就变成了原结点的next变成des,就不能够将新结点与原结点连接
src=des->next;
}
}
//复制随机指针
void copyRandom(Node* head)
{
Node* src=head;
while(src != NULL){
Node* des=src->next;
if(src->random != NULL)
{
des->random=src->random->next;
}
src=des->next;
}
}
};