问题陈述:给出链接列表,使得每个节点包含一个额外的随机指针,该指针可以指向列表中的任何节点或为空。返回列表的深层副本。
original problem link
我有两个非常相似的解决方案,一个被接受,另一个有错误。
Code1(接受的解决方案)
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head == NULL)
return head;
RandomListNode *h1 = head,*h2=NULL;
while(h1!=NULL)
{
h2=new RandomListNode(h1->label);
h2->next=h1->random;
h1->random=h2;
h1=h1->next;
}
h1=head;
while(h1!=NULL)
{
h2=h1->random;
if(h2->next != NULL)
h2->random=h2->next->random;
else
h2->random=NULL;
h1=h1->next;
}
h1=head;
head=h1->random;
while(h1!=NULL)
{
h2=h1->random;
h1->random=h2->next;
if(h1->next!=NULL)
h2->next=h1->next->random;
else
h2->next=NULL;
h1=h1->next;
}
return head;
}
};
Code2 :(给出错误的答案)
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head)
{
if(head == NULL)
return head;
RandomListNode *h1 = head,*h2=NULL;
while(h1!=NULL)
{
h2=new RandomListNode(h1->label);
h2->next=h1->random;
h1->random=h2;
h1=h1->next;
}
h1=head;
head=h1->random;
while(h1!=NULL)
{
h2=h1->random;
if(h2->next != NULL)
h2->random=h2->next->random;
else
h2->random=NULL;
/*MERGED LAST WHILE LOOP FROM HERE*/
h1->random=h2->next;
if(h1->next!=NULL)
h2->next=h1->next->random;
else
h2->next=NULL;
h1=h1->next;
}
return head;
}
};
第二个代码给出一个错误: - 新列表中节点的随机指针指向原始列表中的节点。但在这里我必须生成原始链表的新的和精确的克隆 我在一个循环中简单地合并了最后两个循环。我无法弄清楚出了什么问题。