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
.
Solution:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null || head.next==null) return head;
ListNode fakeHead= new ListNode(0);
fakeHead.next = head;
ListNode less=fakeHead;
while(less.next.val<x){
less=less.next;
if(less.next==null)
return fakeHead.next;
}
ListNode great=less.next;
while(great!=null&&great.next!=null){
if(great.next.val>=x) great=great.next;
else{
ListNode temp = great.next;
great.next=temp.next; //remove temp from list
temp.next=less.next; //insert temp after less
less.next=temp;
less=less.next;
//Notice: dont need great=great.next here.
//Because the value of great.next has changed, need to check the value of great.next again
}
}
return fakeHead.next;
}
}
Note:一般程序有可能对头节点执行增删,插入或改换位置的操作时,需要新建一个fakeHead,指向头结点,来统一对头结点的操作,减少special case,简化代码。