【leetcode每日一题】138.Copy List with Random Pointer

题目:

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

解析:如果是正常的链表,则直接新建结点,然后把结点连接起来即可。但是本题中是有随机结点的,可能在新建结点时,随机节点还没被创建。因此,这种方法是不可行的。我们可以先把所有的结点都复制一遍,再把它们连接起来。步骤如下:

1)在旧链表每个结点后面插入一个copyNode,让copyNode的random和next指向的结点与被拷贝的结点的random和next指向的结点相同。

2)在所有结点被创建后,调整copyNode的random指针,让它指向真正的结点。

3)将整个链表拆分,恢复旧链表,生成新链表。

代码如下:

/**
 * 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 *curNode=head;
         /*第一步:在OldList的每个节点后面都插入一个copyNode(拷贝链表的结点)*/
        while(curNode!=NULL)
        {
            RandomListNode *copyNode=new RandomListNode(curNode->label);
            copyNode->random=curNode->random;
            copyNode->next=curNode->next;
            curNode->next=copyNode;
            curNode=curNode->next->next;
        }
        /*第二步:确定NewList的每个节点*/
        curNode=head;
        while(curNode!=NULL)
        {
            if(curNode->random!=NULL)
            {
                curNode->next->random=curNode->random->next;
            }
            curNode=curNode->next->next;
        }
        /*第三步:还原OldList*/
        RandomListNode *result=new RandomListNode(0);
        result->next=head;
        RandomListNode *temp=result;
        curNode=head;
        while(curNode!=NULL)
        {
            temp->next=curNode->next;
            curNode->next=curNode->next->next;
            temp=temp->next;
            curNode=curNode->next;
        }
        return result->next;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值