【剑指 Offer 35】复杂链表的复制 c++

题目描述:

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例1: 在这里插入图片描述

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例2:
在这里插入图片描述

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例3:
在这里插入图片描述

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。

代码:

/*
// 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:
    unordered_map<Node*,Node*> map;//存储已经被拷贝的链表中的节点
    Node* copyRandomList(Node* head) {
        if(head==nullptr)return nullptr;
        if(map.count(head)==0){//如果head节点还没有被建立
            Node* newnode = new Node(head->val); //新建节点
            map[head] = newnode; //存入map中标记head已经被建立为newhead
            newnode->next = copyRandomList(head->next); //递归地对新建立的newhead赋值
            newnode->random = copyRandomList(head->random);
        }
        return map[head];  //最终返回被建立的head节点
    }
};

使用递归:

因为若简单使用newnode->next = head->next; newnode->random = head->random会出现,head->next和head->random节点还没有被建立的问题(它们都是原链表中的原节点,题目要求深拷贝,不能直接用原节点)。

应该用一个map来保存原链表中节点所对应的新建立的节点,若没有建立,按照head->val new一个新节点,若已经建立,则递归地对其next和random赋值(对next和random的节点进行同样地操作,若还没建立则new,若已经建立则继续赋值其next和random)

直到head=nullptr无法赋值,递归终止

最终返回记录的被建立的节点。
在这里插入图片描述
总结:

1.深拷贝&浅拷贝:

(1)深拷贝是增加了一个新的指针,同时增加了一块和原数据相同内容的内存,新指针指向新内存,即开辟了一块新地址存储数据
(2)浅拷贝只是增加一个指向原数据的指针,复制的是原数据的内存地址

2.深拷贝注意先new,再赋值,不能直接赋值,当多层拷贝时,考虑使用递归

3.map.count(key)返回0或1,表示查找到对应元素或没有查找到对应元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值