这个题也能理解个七七八八,但是代码比较多,跟着写一遍都写不对也是服了
仔细看了看就52行写错了,应该是cur = cur.next;其他都对 这个都有注释就先不多说了,留着多刷几遍慢慢理解把
我看了官网的讲解 其中迭代的思想跟 船长和助教讲的思想一样,但是我感觉人家写的代码更容易理解,于是我自己撸了一遍,具体都有备注 不多说了 跟上面一样还是 newNode.random = node.random ? node.random.next : null 这句话不太理解
var copyRandomList = function (head) {
if (!head) return null;
// 第一步 先复制 for(let i = 0; i< 3; i++)
// for 循环意思 先定义一个变量node,如果这个node有值 然后进行for循环里面的操作
for (let node = head; node; node = node.next.next) {
const newNode = new Node(node.val, node.next, null);
node.next = newNode;
}
// 第二步 修正复制出来的cur的 random指针
for (let node = head; node; node = node.next.next) {
// 这里的newNode 指的是新copy的节点
const newNode = node.next;
// 为啥是node.random.next 这一步不太理解
newNode.random = node.random ? node.random.next : null
// 这个newNode变量可以省略 测试过
// node.next.random = node.random ? node.random.next : null
}
// 第三 在拆分 到这一步 就是已经复制一遍了 开始拆分
const headN = head.next; // 先定义一个新的头节点 一方head指针改变
for (let node = head; node; node = node.next) { // 这里需要一步一步走不跳步了
// 这里的newNode 指的是新copy的节点
const newNode = node.next; // 这个变量不能少 因为瞎 main改变了原来的node.next
node.next = node.next.next; // 隔一个在连接 这里隔开的是copy新的
newNode.next = newNode.next ? newNode.next.next : null// 隔一个在连接 这里隔开的是原来的node
}
// 至此head相当于原先的节点 pre相当于新节点
return headN;
};