给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
public ListNode partition(ListNode head, int x) {
// write your code here
if(head==null || head.next==null)
return head;
ListNode pre= new ListNode(Integer.MIN_VALUE);//防止第一个节点就大于等于x的情况
pre.next=head;
head=pre;
ListNode p=head;
ListNode q= head;
while(q!=null && q.val<x){
q=q.next;//找到第一个大于x的节点
}
if(q==null || q.next==null)
return head.next;//所有节点都小于x 或者只有最后一个节点大于等于x
while(p.next!=q){
p=p.next;//找到第一个大于等于x的节点的前一节点
}
while(q.next != null){
if(q.next.val<x){//将小于x的节点放在p之后
ListNode temp = q.next;
q.next=q.next.next;
temp.next=p.next;
p.next=temp;
p=p.next;
}
else{
q=q.next;
}
}
return head.next;
}
}