LeetCode 138. 复制带随机指针的链表(Map,复制链表,Java)

Posted Kapo1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 138. 复制带随机指针的链表(Map,复制链表,Java)相关的知识,希望对你有一定的参考价值。

本题与剑指 Offer 35. 复杂链表的复制一致

题目

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

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

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 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)或指向链表中的节点。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

需要注意的地方

  1. 遍历创建结点的方法
  2. 对于Map集合的使用
  3. 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 {
    public Node copyRandomList(Node head) {
        // 对于head为空的情况
        if(head == null) {
            return null;
        }
        Map<Node, Node> map = new HashMap<Node, Node>();
        Node t3 = head;
        Node t1 = new Node(head.val);
        Node t2 = t1;
        Node res = t1;
        map.put(head, t1);
        int i = 1;
        // 根据next指针创建结点,组成链表
        while(head.next != null) {
            Node t = new Node(head.next.val);
            map.put(head.next, t);
            t1.next = t;
            t1 = t1.next;
            head = head.next;
        }
        // 根据map对应的random指针的结点,赋值,不然会指向原链表
        while(t3 != null) {
            if(t3.random == null) {
                t2.random = null;
            }
            if(t3.random != null) {
                t2.random = map.get(t3.random);
            }
            t2 = t2.next;
            t3 = t3.next;
        }
        return res;
    }
}

以上是关于LeetCode 138. 复制带随机指针的链表(Map,复制链表,Java)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 138. 复制带随机指针的链表

LeetCode Algorithm 138. 复制带随机指针的链表

LeetCode Algorithm 138. 复制带随机指针的链表

[LeetCode]138复制带随机指针的链表

LeetCode Java刷题笔记—138. 复制带随机指针的链表

Leetcode No.138 复制带随机指针的链表(回溯)