From 00098705530cc5898d0eb818133a94585573ada2 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Mon, 7 Jun 2021 10:34:15 +0800 Subject: [PATCH] =?UTF-8?q?138:=E5=A4=8D=E5=88=B6=E5=B8=A6=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E6=8C=87=E9=92=88=E7=9A=84=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../editor/cn/CopyListWithRandomPointer.java | 121 ++++++++++++++++++ .../editor/cn/CopyListWithRandomPointer.md | 64 +++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.java create mode 100644 src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.md diff --git a/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.java b/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.java new file mode 100644 index 0000000..c64a64e --- /dev/null +++ b/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.java @@ -0,0 +1,121 @@ +//给你一个长度为 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)或指向链表中的节点。 +// +// Related Topics 哈希表 链表 +// 👍 575 👎 0 + +package leetcode.editor.cn; + +import com.code.leet.entiy.Node; + +import java.util.HashMap; +import java.util.Map; + +//138:复制带随机指针的链表 +public class CopyListWithRandomPointer{ + public static void main(String[] args) { + //测试代码 + Solution solution = new CopyListWithRandomPointer().new Solution(); + } + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) +/* +// 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) { + Map map = new HashMap<>(); + return copy(head, map); + } + + private Node copy(Node head, Map map) { + if (head == null) { + return null; + } + if (map.containsKey(head)) { + return map.get(head); + } + Node node = new Node(head.val); + map.put(head, node); + node.next = copy(head.next, map); + node.random = copy(head.random, map); + return node; + } +} +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.md b/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.md new file mode 100644 index 0000000..47be155 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/CopyListWithRandomPointer.md @@ -0,0 +1,64 @@ +

给你一个长度为 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)或指向链表中的节点。
  • +
+
Related Topics
  • 哈希表
  • 链表
  • \n
  • 👍 575
  • 👎 0
  • \ No newline at end of file