题解 | #复杂链表的复制#
复杂链表的复制
https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead) {
if(pHead==nullptr) return NULL;
//在原节点后面添加一个拷贝节点
RandomListNode* node=pHead;
RandomListNode* copynode=nullptr;
RandomListNode* tmp=nullptr;
while(node){
tmp=node;
node=node->next;
copynode=new RandomListNode(tmp->label);
tmp->next=copynode;
copynode->next=node;
}
//如果原节点random指针不为空,那么它的拷贝节点random指针就指向原来节点random指向的下一个
node=pHead;
while(node){
copynode=node->next;
if(node->random){
copynode->random=node->random->next;
}
node=node->next->next;
}
//将原节点和拷贝节点断开
node=pHead;
copynode=node->next;
tmp=copynode;
while(copynode->next){
node->next=copynode->next;//原节点下一个指向拷贝节点的下一个
node=node->next;//下一个原节点
copynode->next=node->next;//拷贝节点的下一个指向原节点的下一个
copynode=copynode->next;//下一个拷贝节点
}
//最后一个原节点下一个原来指向最后一个拷贝节点,现在要还原为指向空
node->next=nullptr;
return tmp;
}
};
