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

思路
递归 + 哈希表
- 先对结点进行普通拷贝,然后对next和random指针进行递归拷贝
- 用哈希表存储已经拷贝过的,原结点和新结点之间的映射,防止重复拷贝
代码
/*
// 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);
}
}
这篇博客探讨了如何使用递归和哈希表来实现一个复杂链表的深拷贝,其中链表的节点包含next和random指针。通过创建新的节点并维护一个映射表避免重复拷贝,博主详细阐述了思路和代码实现,确保拷贝后的链表与原链表具有相同的状态。

3576

被折叠的 条评论
为什么被折叠?



