LeetCode剑指 Offer 35—复杂链表的复制(哈希表/递归)

简介: LeetCode剑指 Offer 35—复杂链表的复制(哈希表/递归)

unordered_map

count函数直接放回的是一个数值,如果存在,那么返回1,反之0;

find返回的是一个iterator, 直接输出iterator是会报错的,要输出的话得取出迭代器的值再输出。


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

bb2b4f893981400b91f74acd42165cb8.png

c167991d31704a5e8baa53f6203db854.png

#include <unordered_map>
class Solution {
public:
    unordered_map<Node*,Node*> h;
    Node* copyRandomList(Node* head) {
        if(head == NULL)
            return head;
        if(!h.count(head))
        {
            Node* n = new Node(head->val);
            // n->val = head->val;
            h[head] = n;
            n->next = copyRandomList(head->next);
            n->random = copyRandomList(head->random);
        }
        return h[head];
    }
};

本题要求我们对一个特殊的链表进行深拷贝。本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要随时根据随机指针创建结点。

我们利用回溯的方式,对于当前节点,我们首先要进行拷贝值,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝(我们检查「当前节点的后继节点」和「当前节点的随机指针指向的节点」的创建情况。如果这两个节点中的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。),拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。


我们用哈希表记录每一个节点对应新节点的创建情况。注意一个节点可能被多个其他节点指向,因此我们可能递归地多次尝试拷贝某个节点,为了防止重复拷贝,我们需要首先检查当前节点是否被拷贝过,如果已经拷贝过,我们可以直接从哈希表中取出拷贝后的节点的指针并返回即可。


相关文章
|
1天前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
8 1
|
1天前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
10 1
|
1天前
|
索引
每日一题:力扣328. 奇偶链表
每日一题:力扣328. 奇偶链表
13 4
|
1天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
1天前
|
算法
leetcode代码记录(二叉树递归遍历
leetcode代码记录(二叉树递归遍历
8 0
|
1天前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
10 0
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——链表的中间结点
【每日一题】LeetCode——链表的中间结点
|
1天前
|
C++
[leetcode 链表] 反转链表 vs 链表相交
[leetcode 链表] 反转链表 vs 链表相交
|
1天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”