zoukankan      html  css  js  c++  java
  • leetcode 138 复制带随机指针的链表

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

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

    例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 x.random --> y

    返回复制链表的头节点。

    用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

    • val:一个表示 Node.val 的整数。
    • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

    你的代码 接受原链表的头节点 head 作为传入参数。

    示例 1:

    输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
    输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
    

    示例 2:

    输入:head = [[1,1],[2,1]]
    输出:[[1,1],[2,1]]
    

    示例 3:

    输入:head = [[3,null],[3,0],[3,null]]
    输出:[[3,null],[3,0],[3,null]]
    

    示例 4:

    输入:head = []
    输出:[]
    解释:给定的链表为空(空指针),因此返回 null。
    

    提示:

    • 0 <= n <= 1000
    • -10000 <= Node.val <= 10000
    • Node.random 为空(null)或指向链表中的节点。

    哈希

    package com.example.lettcode.hashtable;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Class CopyRandomList
     * @Description 138 复制带随机指针的链表
     * @Author
     * @Date 2021/7/22
     **/
    public class CopyRandomList {
    
        static class Node {
            int val;
            Node next;
            Node random;
    
            public Node(int val) {
                this.val = val;
                this.next = null;
                this.random = null;
            }
        }
    
        /**
         * 哈希
         *
         * @param head
         * @return
         */
        public static Node copyRandomList(Node head) {
            if (head == null) return null;
    
            Map<Node, Node> nodeMap = new HashMap<>();
            Node node = head;
            /**
             * 利用哈希得到每个节点的复制节点
             */
            while (node != null) {
                Node nodeCopy = new Node(node.val);
                nodeMap.put(node, nodeCopy);
                node = node.next;
            }
    
            /**
             * 得到每个节点对应复制节点的下一个节点和随机指针
             */
            node = head;
            Node nodeCopyHead = nodeMap.get(head);
            Node nodeCopy = nodeCopyHead;
            while (node != null) {
                nodeCopy.next = nodeMap.get(node.next);
                nodeCopy.random = nodeMap.get(node.random);
                node = node.next;
                nodeCopy = nodeCopy.next;
            }
            return nodeCopyHead;
        }
    }
    
  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/fyusac/p/15043118.html
Copyright © 2011-2022 走看看