剑指 offer 35.复杂链表的赋值
将原来的链表中的节点的值复制,生成新的链表,然后根据原来的节点直接的关系,将新的节点的结构连接起来,就完成了链表的复制。
看完题目你可能有点疑惑,这题究竟想要我们做些什么,实际上就是复制一个复杂链表。题目提供的链表究竟复杂在哪里,其实就是一般的链表节点只有两个属性,一个 val(本题目中叫做 label),一个 next,但是本题的链表节点有三个属性,每一个节点还有一个 random 属性,随机指向另一个链表。
我们的代码需要将这整个链表复制一遍,所以思路也很清楚,复制 val,复制 next,复制 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) {
const originToClone = new Map()
// 第一次遍历,将所有的节点克隆,映射关系是原来的节点和一个新的节点
for(let i = head; i !== null; i = i.next) {
if(!originToClone.has(i)) {
originToClone.set(i, new Node(i.val))
}
}
// 第二次遍历,将克隆的节点连接起来
for(let i = head; i !== null; i = i.next) {
if(i.next !== null) {
originToClone.get(i).next = originToClone.get(i.next)
}
if(i.random !== null) {
originToClone.get(i).random = originToClone.get(i.random)
}
}
return originToClone.get(head)
};