算法小解: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;        
    }
}
相关推荐
有梦想的骇客3 小时前
书籍将正方形矩阵顺时针转动90°(8)0605
线性代数·算法·矩阵
有梦想的骇客3 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
Chenyu_3103 小时前
12.找到字符串中所有字母异位词
c语言·数据结构·算法·哈希算法
苏三福4 小时前
yolo11-seg ultralytics 部署版本
算法·yolo11
wuqingshun3141596 小时前
蓝桥杯 冶炼金属
算法·职场和发展·蓝桥杯
豪斯有话说7 小时前
C++_哈希表
数据结构·c++·散列表
jndingxin8 小时前
OpenCV CUDA模块光流计算-----实现Farneback光流算法的类cv::cuda::FarnebackOpticalFlow
人工智能·opencv·算法
编程绿豆侠8 小时前
力扣HOT100之栈:394. 字符串解码
java·算法·leetcode
朝朝又沐沐8 小时前
基于算法竞赛的c++编程(18)string类细节问题
开发语言·c++·算法