题目
-
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
-
leetcode链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
-
示例 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]]
思路
- 利用map存储原节点对新节点的映射,先复制新链表,再利用映射设置random节点。
- 剑指OFFER版本。先复制结点,插入到原节点后面。再设置random指针。再拆分新旧链表
代码
/**
* // Definition for a Node.
* function Node(val, next, random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
/**
* @param {Node} head
* @return {Node}
*/
var copyRandomList = function (head) {
if (!head) return null
let node = head
while (node) {
const after = node.next
const cloneNode = new Node(node.val)
node.next = cloneNode
cloneNode.next = after
node = cloneNode.next
}
node = head
const cloneHead = node.next
let cloneNode = cloneHead
while (cloneNode) {
cloneNode.random = node.random ? node.random.next : null
node = cloneNode.next
cloneNode = cloneNode.next ? cloneNode.next.next : null
}
node = head
cloneNode = cloneHead
while (node && cloneNode) {
node.next = cloneNode.next
cloneNode.next = node.next ? node.next.next : null
node = node.next
cloneNode = cloneNode.next
}
return cloneHead
}