35.复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特
殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不
要返回参数中的节点引用,否则判题程序会直接返回空)
思路
没有细看书上的思路,但是貌似讲的有点复杂。
这道题目看上去复杂,其实实现起来很简单,分2步就可以。
Step 1
首先不要受 random 指针的干扰,顺序复制一遍 next 节点;
Step 2
利用已经复制好的,顺序链表,再从头遍历一遍,沿途再把 random 指针给复制上。
结束
代码
/*
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 == NULL) return NULL;
RandomListNode* p1 = pHead;
RandomListNode* ret = new RandomListNode(pHead->label);
RandomListNode* p2 = ret;
// Step1 赋值顺序结构
while (p1->next) {
RandomListNode* tmp = new RandomListNode(p1->next->label);
p2->next = tmp;
p1 = p1->next;
p2 = p2->next;
}
// Step2 赋值 random 指针
p1 = pHead;
p2 = ret;
while (p1) {
if (p1->random) {
RandomListNode* tmp = new RandomListNode(p1->random->label);
p2->random = tmp;
}
p1 = p1->next;
p2 = p2->next;
}
return ret;
}
};