leetCode: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.

分析:

我们知道如果是简单的copy List 的话,那么我们只需要从头到尾遍历下来,new出对应个数的Node,并把它们的连接关系设置好就可以了,但是这道题目中每个节点Node出现了Random属性,也就意味着可能当前结点Node所依赖的那个Random对应的结点还没有被创建出来。

解题思路:

为了解决“分析”里提到的问题,我们需要做如下三步处理!

1. 在OldList中的每个结点后,插入一个CopyNode,这个结点的Random域和Next域与OldList中的被拷贝Node的Random域和Next一致,然后让被拷贝结点的Next域指向CopyNode结点,这样先创建出OldList中结点对应的CopyNode结点。

2. 由于所有的CopyNode都已经创建出来了,我们就可以调整这些CopyNode真正的Random域的值了。

3. 调整所有CopyNode的Next域的值,恢复OldList所有Node的Next的值到初始状态!

/**
 * 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 NULL;
        RandomListNode* p=head;
        while(p)
        {
            RandomListNode *q=new RandomListNode(p->label);
            q->next=p->next;
            p->next=q;
            p=q->next;
        }

        p=head;
        while(p)
        {
            if(p->random) p->next->random=p->random->next;
            p=p->next->next;
        }

        RandomListNode* newList=new RandomListNode(0);
        RandomListNode* r=newList;p=head;
        while(p)
        {
            r->next=p->next;
            if(p->next) p->next=p->next->next;
            r=r->next;
            p=r->next;
        }

    return newList->next;

    }
};


注意:复制过程如果修改了原样本链表,记得最后还原













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值