链表

随机链表的复制

中等#138Java时间 O(n)空间 O(n)

题目要做什么

复制带 next 和 random 指针的链表。每个输入元素是 [值, random 指向的下标],null 表示空指针。新链表所有节点必须与原链表不同。

题目示例输入head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
题目示例输出[[7,null],[13,0],[11,4],[10,2],[1,0]]

01 为什么这样做

第一遍为每个原节点创建新节点,并记录原节点到副本的映射。第二遍通过映射复制 next、random 两种连接。

始终成立的条件

连接副本之前,每个原节点都已经有唯一副本;副本的指针只指向副本节点。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public Node copyRandomList(Node head) {3        Map<Node, Node> copies = new HashMap<>();4        for (Node current = head; current != null; current = current.next) {5            copies.put(current, new Node(current.val));6        }7        for (Node current = head; current != null; current = current.next) {8            Node copy = copies.get(current);9            copy.next = copies.get(current.next);10            copy.random = copies.get(current.random);11        }12        return copies.get(head);13    }14}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索