function partition(head: ListNode | null, x: number): ListNode | null {
if (!head) {
return null
}
let current = head // 当前遍历原始链表的位置
let lessDummy = new ListNode() // 按照顺序存放小于的值
let greaterDummy = new ListNode() // 按照顺序存放大于的值
let less = lessDummy // 小于的链表的末尾
let greater = greaterDummy // 大于的链表的末尾
while (current) {
if (current.val < x) {
less.next = current
less = less.next
} else {
greater.next = current
greater = greater.next
}
current = current.next
}
less.next = greaterDummy.next // 将小于和大于的链表连接起来
greater.next = null // 避免后面还有小于的值造成循环
return lessDummy.next
}
方式一需要结束后将 greater.next 置为 null,因为 greater 处理完后可能最终的 greater 后面跟着的是小于的值,这样的话就会形成循环
如果每次追加结点都将 next 置为 null,那么处理结束后的链表就不需要额外处理了
function partition(head: ListNode | null, x: number): ListNode | null {
if (!head) {
return null
}
let current = head // 当前遍历原始链表的位置
let lessDummy = new ListNode() // 按照顺序存放小于的值
let greaterDummy = new ListNode() // 按照顺序存放大于的值
let less = lessDummy // 小于的链表的末尾
let greater = greaterDummy // 大于的链表的末尾
while (current) {
if (current.val < x) {
less.next = current
less = less.next
} else {
greater.next = current
greater = greater.next
}
// 手动将接上来的结点的 next 断掉
// 避免后面形成循环指针
const temp = current.next
current.next = null
current = temp
}
less.next = greaterDummy.next // 将小于和大于的链表连接起来
return lessDummy.next
}