Leetcode--Java--138. 复制带随机指针的链表

这篇博客探讨了如何使用递归和哈希表来实现一个复杂链表的深拷贝,其中链表的节点包含next和random指针。通过创建新的节点并维护一个映射表避免重复拷贝,博主详细阐述了思路和代码实现,确保拷贝后的链表与原链表具有相同的状态。

题目描述

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

样例描述

在这里插入图片描述

思路

递归 + 哈希表

  1. 先对结点进行普通拷贝,然后对next和random指针进行递归拷贝
  2. 用哈希表存储已经拷贝过的,原结点和新结点之间的映射,防止重复拷贝

代码

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    //原链表和新链表之间的映射
    Map<Node, Node> cache = new HashMap<>();
    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        //缓存中不存在才拷贝,否则直接获取
        if (!cache.containsKey(head)) {
            //普通拷贝
            Node newHead = new Node(head.val);
            //放入缓存
            cache.put(head, newHead);
            //进行next指针和random指针的深拷贝
            newHead.next = copyRandomList(head.next);
            newHead.random = copyRandomList(head.random);
        } 
        return cache.get(head);    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值