算法小解:138. 随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝 。 深拷贝应该正好由 n全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点

解:哈希表,可以先按照next指针的顺序先构造一个新链表,在构造的过程中,将原来的节点和其对应复制的新节点利用哈希表一一对应,然后之后遍历每个原始节点的random节点就能够找到新节点。

java 复制代码
/*
// 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 {
    public Node copyRandomList(Node head) {
        Node pre = new Node(0);
        Node cur = head;
        Node new_node = pre;
        HashMap<Node, Node> map = new HashMap<>(); // 用于映射<原节点,新节点>
        while(cur != null){
            new_node.next = new Node(cur.val);
            new_node = new_node.next;
            map.put(cur, new_node); // 映射
            cur = cur.next;
        }
        cur = head;
        new_node = pre.next;
        while(cur != null){
            if(cur.random != null){
                new_node.random = map.get(cur.random);
            }
            cur = cur.next;
            new_node = new_node.next;
        }
        return pre.next;        
    }
}
相关推荐
橘颂TA12 分钟前
【笔试】算法的暴力美学——牛客 BC140:杨辉三角
数据结构·牛客
Lsk_Smion23 分钟前
Hot100(开刷) 之 长度最小的数组--删除倒数第N个链表--层序遍历
java·数据结构·算法·kotlin
luoganttcc24 分钟前
dim3 grid_size(2, 3, 4); dim3 block_size(4, 8, 4)算例
算法
WBluuue32 分钟前
Codeforces 1088 Div1+2(ABC1C2DEF)
c++·算法
像素猎人41 分钟前
map<数据类型,数据类型> mp和unordered_map<数据类型,数据类型> ump的讲解,蓝桥杯OJ4567最大数目
c++·算法·蓝桥杯·stl·map
Narrastory42 分钟前
Note:强化学习(一)
人工智能·算法·强化学习
沐雪轻挽萤1 小时前
1. C++17新特性-序章
java·c++·算法
郝学胜-神的一滴1 小时前
从链表到二叉树:树形结构的入门与核心性质解析
数据结构·c++·python·算法·链表
csdn_aspnet1 小时前
C语言 (QuickSort using Random Pivoting)使用随机枢轴的快速排序
c语言·算法·排序算法
玖釉-1 小时前
深入解析 meshoptimizer:基于 meshopt_computeSphereBounds 的层级包围球构建与 DAG 优化
c++·算法·图形渲染