86. Partition List #
题目 #
给定链表头节点head和一个特定值x,对链表进行分隔,使得所有小于x的节点都出现在大于或等于x的节点之前。应保留两个分区中每个节点的初始相对位置。
思路 #
- 定位第一个值小于
x的节点的前驱节点secLessLast,以及第一个值不小于x的节点secMoreFirst - 设置
preserve指针,指向当前secMore分区的最后一个节点 - 移动
preserve指针,每次查看preserve指针的下一个节点,若其值小于x,则将此节点设置为新的secLessLast节点
代码 #
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode sentinel = new ListNode(-1, head);
ListNode secLessLast = sentinel;
while (secLessLast.next != null && secLessLast.next.val < x) secLessLast = secLessLast.next;
ListNode secMoreFirst = secLessLast.next;
ListNode preserve = secMoreFirst;
while (preserve != null && preserve.next != null) {
if (preserve.next.val >= x) preserve = preserve.next;
else {
ListNode ptr = preserve.next;
preserve.next = ptr.next;
secLessLast.next = ptr;
ptr.next = secMoreFirst;
secLessLast = ptr;
}
}
return sentinel.next;
}
}