剑指 Offer 35. 复杂链表的复制(Map)

Description
在这里插入图片描述

Solution
存在两种拷贝:深拷贝和浅拷贝

深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,
因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。

浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。

而本题需要我们用深拷贝来复制该复杂链表,若每个节点只有一个next指针指向下一个节点,则只需要顺序遍历一遍待拷贝链表,同时复制一份即可;但这里还有一个random指针,所有我们需要同时建立原链表和新链表内存地址的对应关系,再遍历一遍时进行random指针的赋值。

时间复杂度 O ( N log ⁡ N ) O(N\log N) O(NlogN)

Code

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    typedef Node* pNode;
    map<pNode, pNode>mp;
    void dfs1(pNode Nnow, pNode now) {
        pNode nx = new Node(0);
        Nnow->val = now->val;
        Nnow->next = nx;
        mp[now] = Nnow;
        if(now->next == NULL) {
            Nnow->next = NULL;
            return ;
        }
        dfs1(nx, now->next);
    }
    void dfs2(pNode Nnow, pNode now) {
        if(now->random != NULL)
            Nnow->random = mp[now->random];
        else Nnow->random = NULL;
        if(now->next == NULL) return ;
        dfs2(Nnow->next, now->next);
    }
    Node* copyRandomList(Node* head) {
        if(head == NULL) return NULL;
        pNode Nhead = new Node(0);
        dfs1(Nhead, head);
        dfs2(Nhead, head);
        return Nhead;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值