使用随机指针复制链表

时间:2015-07-07 15:10:00

标签: c++ data-structures linked-list

问题陈述:给出链接列表,使得每个节点包含一个额外的随机指针,该指针可以指向列表中的任何节点或为空。返回列表的深层副本。 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;
    }
};

第二个代码给出一个错误: - 新列表中节点的随机指针指向原始列表中的节点。但在这里我必须生成原始链表的新的和精确的克隆 我在一个循环中简单地合并了最后两个循环。我无法弄清楚出了什么问题。

0 个答案:

没有答案