复杂链表的复制练习

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

首先题目是要将链表进行复制,但是因为存在random指针,所以不借助辅助结构比较麻烦,下面的算法是空间复杂度为O(1)的方法,首先将每一个节点向后复制一个并连起来,之后再复制random指针,需要注意不能直接复制random指针,因为random指针指向的是正常的节点,需要让random指针指向复制的节点,所以首先需要复制next指针,之后再复制random指针,之后将整个链表分裂成两个即可。

注意!!一定将两个链表彻底分开

/*
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)
            return NULL;
        RandomListNode* prehead=new RandomListNode(0);
        prehead->next=pHead;
        RandomListNode* prerandomlist=new RandomListNode(0);        
        RandomListNode* normallist=prehead->next;

        while(pHead)
            {
            RandomListNode* temp=new RandomListNode(pHead->label);
            temp->next=pHead->next;
            pHead->next=temp;
            pHead=temp->next;
        }
        pHead=prehead->next;
        while(pHead)
            {
            if(pHead->random)
                {
                pHead->next->random=pHead->random->next;
                pHead=pHead->next->next;
            }
            else
                {
                pHead=pHead->next->next;
            }
        }
        prerandomlist->next=prehead->next->next;
        RandomListNode* randomlist=prerandomlist->next;

        while(normallist)
            {
                normallist->next=randomlist->next;
                normallist=normallist->next; 
            if(normallist){
                randomlist->next=normallist->next;
                randomlist=randomlist->next;
            }
                }

        return prerandomlist->next;                      
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值