【leetcode】35. **复制带随机指针的链表(深拷贝!利用哈希表来存原结点和拷贝结点的一一对应关系)

题目

请实现 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]]
  • 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
  • 但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
    在这里插入图片描述

暴力法:哈希表存原结点和拷贝结点的一一对应关系

等一个leetcode官方解答

暴力法。基于哈希表。时间复杂度O(N),空间复杂度O(N)。

  1. 第一次遍历原链表:复制值,新建一个神拷贝结点;然后利用哈希表来存储原有结点(key)和深拷贝结点(value)的一一对应关系
  2. 第二次遍历原链表:此时新结点都已存在,那就可以拷贝next指针和ramdom这种复杂指针了。具体细节是:拷贝结点的next/random = 原结点的next/random在hashmap中对应的拷贝
/*
// 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:
    /*
    暴力法。基于哈希表。时间复杂度O(N),空间复杂度O(N)
    第一次遍历原链表:复制值,新建一个神拷贝结点;然后利用哈希表来存储原有结点(key)和深拷贝结点(value)的一一对应关系
    第二次遍历原链表:此时新结点都已存在,那就可以拷贝next指针和ramdom这种复杂指针了
    */
    Node* copyRandomList(Node* head) {
        if(head==NULL)
            return NULL;
        unordered_map<Node*, Node*> unmap;
        //第一次遍历:建立hashmap,此时只拷贝了值
        for(Node *it = head; it != NULL; it = it->next){
            unmap[it] = new Node(it->val);
        }
        //第二次遍历:拷贝两个指针
        for(Node *it = head; it != NULL; it = it->next){
            //拷贝结点的next = 原结点的next在hashmap中对应的拷贝
            if( it->next!=NULL ){
                unmap[it]->next = unmap[it->next]; 
            }
            //random同上
            if( it->random!=NULL ){
                unmap[it]->random = unmap[it->random]; 
            }
        }
        return unmap[head];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值