Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2
and x = 3,
return 1->2->2->4->3->5
.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**This is a fundamental problem. But we need to pay attention to some subtle problems.
* such as the null pointers.
* @author Averill Zheng
* @version 2016-06-07
* @since JDK 1.7
*/
public ListNode partition(ListNode head, int x) {
ListNode newHead = new ListNode(0);
if(head != null){
newHead.next = head;
ListNode firstLarger = head;
ListNode insertPosition = newHead;
while(firstLarger != null && firstLarger.val < x){
insertPosition = insertPosition.next;
firstLarger = firstLarger.next;
}
ListNode current = firstLarger;
while(firstLarger != null){
if(firstLarger.val >= x){
current = firstLarger;
firstLarger = firstLarger.next;
}
else{
current.next = firstLarger.next;
firstLarger.next = insertPosition.next;
insertPosition.next = firstLarger;
insertPosition = insertPosition.next;
firstLarger = current.next;
}
}
}
newHead = newHead.next;
return newHead;
}
}