[86] 分隔链表(12)

57 阅读1分钟

头天晚上听了船长和助教的讲解,今天来盲写,发现一些问题记录一下,图中只是圈中一部分, 1 是 32,35行 把判断好的节点分给big或者small以后 还要b/s 往后面移动 因为上面已经big.next=cur,32行不能big = cur, 2 small.next = bigN.next 而不是big.next; 3 最后return 的是 smallN.next而不是small.next 4 42行代码之前 还需要big.next = null, 官网给出的解释是 遍历结束后,我们将指针置空,这是因为当前节点复用的是原链表的节点,而其big.next 指针可能指向一个小于 xx 的节点,我们需要切断这个引用

5 28行 判断cur.val >x的话 需要>=

image.png

把上面几个问题解决以后都出现正确代码

var partition = function (head, x) {
	if (!head) return null;
	let big = new ListNode(), small = new ListNode();
	// 定义这两个头节点 说是防止big节点移丢
	let bigN = big, smallN = small;
	let cur = head;
	// 分割链表
	while (cur) {
		if (cur.val >= x) {
			// 把当前节点拼接到big后面
			big.next = cur;
			// big节点往后移动以为 也可以直接big = cur,
			big = big.next;
		} else {
			small.next = cur;
                        // 也可以直接small = cur
			small = small.next
		}
		cur = cur.next;
	}
	big.next = null;
	// 拼接链表
	small.next = bigN.next;
	return smallN.next;
};