```function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}
function Clone(pHead) {
// write code here
//Step1插入和赋值:在每一个节点N后插入一个此节点的复制N*,给复制节点的random赋值,每个节点的random指针指向的节点S的复制节点S*也会在S后面
//Step2拆分和返回: 此时,所有原节点都是奇数节点,所有复制节点都是偶数节点,将偶数节点取出就是返回的链表
if (!pHead) {
return null
}
let temp = pHead
//插入复制节点
while (temp) {
let copyNode = new RandomListNode(temp.label)
copyNode.next = temp.next
temp.next = copyNode
temp = copyNode.next
}
//给复制节点random赋值,但注意如果.random是空的话要赋值空
temp = pHead
while (temp) {
if (temp.random) {
temp.next.random = temp.random.next
}
else{temp.next.random = null}
temp = temp.next.next
}
//拆分节点
temp = pHead.next //找到第一个偶数节点
let root = new RandomListNode(0) //设置一个新的头节点
let r = root
while (temp) {
r.next = temp //将原链表偶数节点赋给新链表
r = r.next
//判断是否为最后一个节点,如果是终止循环,如果不是,找到下一个偶数节点
//如果不判断直接用.next.next的话,当temp是最后一个节点,temp.next是null,null.next无法读取,报错
if(temp.next===null){break}
temp = temp.next.next
}
return root.next
}
module.exports = {
Clone : Clone
};