复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思想:因为这个链表是复杂链表,及有一个指针指向任意一个节点。所以不可能,遍历复制。所以有了这么一个想法。遍历一遍把每个节点单独值拷贝,然后把这个拷贝出来的新节点,直接插到被拷贝的节点之后,那么这个链表就变成了这样。
在我们成功把每个链表查进入,其实我们只是拷贝了label的值,两个指针的值都不相同,聪明的可以发现,被拷贝的复杂指针指向谁,拷贝的就指向它的下一个就可以了。这样我们就完成了,复杂指针的拷贝。
最后在遍历一遍,把一开始装在被拷贝链表上的新节点们,拆下来,串起来就可以啦。
也就是说三次遍历,O(3n)的时间复杂度哦~
/*
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 pHead;
}
RandomListNode* cur = pHead;
while(cur != NULL)
{
RandomListNode* newnode = new RandomListNode(cur->label);
newnode->next = cur->next;
newnode->random = NULL;
cur->next = newnode;
cur = newnode->next;
}
cur = pHead;
RandomListNode *newnode = cur->next;
while(cur != NULL)
{
newnode = cur->next;
if(cur->random != NULL)
{
newnode->random = cur->random->next;
}
cur = newnode->next;
}
cur = pHead;
RandomListNode* ret = cur->next;
newnode = cur->next;
while(cur != NULL)
{
newnode = cur->next;
cur->next = newnode->next;
cur = cur->next;
if(cur != NULL)
newnode->next = cur->next;
else newnode->next = NULL;
}
return ret;
}
};