记录一道算法题
分隔链表
86. 分隔链表 - 力扣(LeetCode) (leetcode-cn.com)
要求:
* 小于x的节点放左边,大于等于x的节点放右边
* 保持原来节点之间的相对位置
至少也要遍历链表一次的,问题是如何处理节点的衔接。 这里提到了一个伪节点的概念,新创建一个节点作为开头,可以不用做if判断初始化开头节点。
实际上不用考虑节点之间的旧联系,因为会随着节点的赋值而重置。只需要等分区后衔接两个区域的边缘就可以了
function partition(head, x) {
const before = new ListNode()
const after = new ListNode()
// 指针
let minStart = before
let maxStart = after
// 遍历
while(head) {
if (head.val < x) {
minStart = minStart.next = head
} else {
maxStart = maxStart.next = head
}
head = head.next
}
// 当没有小于x或者大于等于x的节点的时候,用另一个的开头
if (before.next == null) {
head = after.next
} else {
head = before.next
}
// 首尾衔接,并且清除尾巴
// 值得注意的是,当没有小于x的节点的时候,minStart赋值做不做都行
minStart.next = after.next
maxStart.next = null
return head
};