算法小解: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;        
    }
}
相关推荐
Jerry2 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry4 小时前
LeetCode 459. 重复的子字符串
算法
海石7 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石7 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry9 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding9 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL11 小时前
我的数据结构3——链表(link list)
数据结构·链表
a11177611 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜11 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry11 小时前
LeetCode 541. 反转字符串 II
算法