题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路
(1)最初的思路希望直接以递归来解决问题,但是运行会发生内存不足的情况,考虑到使用该递归方式会不断地创造新的重复空间,使得内存占用量大大提升,因而内存不足,代码如下:
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
RandomListNode* res = new RandomListNode(pHead->label);
if(pHead == NULL) return NULL;
//res->label = pHead->label;
if(pHead->next) res->next = Clone(pHead->next);
if(pHead->random) res->random = Clone(pHead->random);
return res;
}
};
(2)随后参考了其他的解决思路,大致方法是先不管random指针,将每一个节点先复制一份串进被复制结点的后面。接着遍历整个链表,将复制部分的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* currnode = pHead;
while(currnode){
RandomListNode* tmp = new RandomListNode(currnode->label);
tmp->next = currnode->next;
currnode->next = tmp;
currnode = tmp->next;
}
currnode = pHead;
while(currnode){
RandomListNode *tmp = currnode->next;
if(currnode->random)
tmp->random = currnode->random->next; //这一句话一定记得要加上,否则会出现段错误
currnode = tmp->next;
}
currnode = pHead;
RandomListNode *res = pHead->next;
while(currnode){
RandomListNode *tmp = currnode->next;
currnode->next = tmp->next;
currnode = tmp->next;
if(tmp->next!=NULL)
tmp->next = tmp->next->next;
}
return res;
}
};