[138] 复制带随机指针的链表(13)

87 阅读1分钟

这个题也能理解个七七八八,但是代码比较多,跟着写一遍都写不对也是服了

image.png 仔细看了看就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;
};