头天晚上听了船长和助教的讲解,今天来盲写,发现一些问题记录一下,图中只是圈中一部分, 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的话 需要>=
把上面几个问题解决以后都出现正确代码
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;
};