描述
给定一个单链表和数值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)
return null;
ListNode q,p=null,t=null;
ListNode node=new ListNode(Integer.MIN_VALUE);//预制头结点
node.next=head;
head=node;
q=head;
while(q!=null&&q.val<x){//q指向第一个比x大的节点,p为q的上一个节点
p=q;
q=q.next;
}
if(q==null){
return head.next;
}
t=p;
while(q!=null){ //遍历q,把小于x的节点移动到p的后面
if(q.val<x){
t.next=q.next;
q.next=p.next;
p.next=q;
q=t.next;
p=p.next;//每交换一次节点,p向后移
}else{
t=q;
q=q.next;
}
}
return head.next;
}
}