22、复杂链表的复制

题目:

输入一个复杂链表(每个节点中又节点值,以及两个指针,一个指向下一个节点,一个指向任意节点)返回结果为复制后复杂链表的head。

解法:

(一)先复制每一个节点以及每一个节点的next指针,再从头遍历每一个节点,记录它们的random节点,再head遍历节点寻找random节点所在的位置。这样会用两个循环进行。时间复杂度o(n^2)

(二)1、先复制每一个节点以及每一个节点的next指针。

          2、将新复制的链表与旧链表连接起来。例如原链表为a-b-c-d-e-f-g-NULL。复制后的链表为a'-b'-c'-d'-e'-f'-g'-NULL。

          将新旧链表连接起来后的链表为a-a'-b-b'-c-c'-d-d'-e-e'-f-f'-g-g'-NULL.那么连接后的链表中存在的这样的一个关系。

          a->random->next = a->next->random,其中a->next =a'  即 a'->random = a->random->next,即寻得a'

          的random指针。

          3、将新旧链表拆开即可。假设连接后的链表为a-a'-b-b'-c-c'-d-d'-e-e'-f-f'-g-g'-NULL,

          从头开始遍历,让cur->next 指向cur->next->next即可。

代码如下:

    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(pHead==NULL)
            return NULL;
        RandomListNode* cur =pHead;
        while(cur!=NULL) // 复制next
        {
            RandomListNode* temp = new RandomListNode(cur->label);
            temp->next = cur->next;
            cur->next = temp;
            cur = temp->next;
        }
        cur = pHead;
        while(cur!=NULL) // 复制random
        {
            if(cur->random!=NULL)
                cur->next->random = cur->random->next;
            cur = cur->next->next;//注意此处,要写在if外面,当某个节点的random指向空的时候,cur仍然要继续前移
        }
        cur = pHead;
        RandomListNode * newhead = cur->next;
        while(cur->next!=NULL) //拆链表
        {
            RandomListNode* temp = cur->next;
            cur->next = temp->next;
            cur = temp;
        }
        return newhead;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值