题目
解题思路
定义两个虚拟头节点
- 小于区域的头节点
- 一个大于等于区域的虚拟头节点, 顺序遍历原链表,检查每一个节点并添加即可 值得注意的是:需要去除每一个节点的next,否则可能会出现环
代码
TypeScript
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function partition(head: ListNode | null, x: number): ListNode | null {
// const d1 = { next: null }, d2 = { next: null }
const [lNode, rNode] = [new ListNode(-1), new ListNode(-1)];
let c1 = lNode, c2 = rNode
// 和快排的思想非常类似
while (head !== null) {
const tmp = head.next; // 去环
head.next = null
if (head.val < x) {
c1.next = head
c1 = c1.next;
} else {
c2.next = head;
c2 = c2.next;
}
head = tmp;
}
c1.next = rNode.next;
return lNode.next
};