public ListNode partition(ListNode head, int x) {
if (head == null) return null;
ListNode leftDummy = new ListNode(0);
ListNode left = leftDummy;
ListNode rightDummy = new ListNode(0);
ListNode right = rightDummy;
ListNode node = head;
while (node != null) {
if (node.val < x) {
left.next = node;
left = left.next;
} else {
right.next = node;
right = right.next;
}
node = node.next;
}
// post-processing
right.next = null;
left.next = rightDummy.next;
return leftDummy.next;
}