给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
import java.util.Scanner;
/**
*
* 给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
您在真实的面试中是否遇到过这个题? Yes
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
* @author Dell
*
*/
public class Test96 {
public static ListNode partition(ListNode head, int x)
{
if(head==null||head.next==null)
return head;
ListNode temp=new ListNode(-1);
temp.next=head;
ListNode p=temp;
ListNode q=temp.next;
ListNode r=temp;
while(q!=null)
{
if(q.val<x)
{
if(p==temp)
{
p=p.next;
q=q.next;
r=r.next;
}
else
{
if(p.val>=x)
{
ListNode temp1=q;
q=q.next;
p.next=temp1.next;
temp1.next=null;
temp1.next=r.next;
r.next=temp1;
r=r.next;
}
else
{
p=p.next;
q=q.next;
r=r.next;
}
}
}
else
{
p=p.next;
q=q.next;
}
}
return temp.next;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ListNode list=new ListNode(-1);
ListNode p=list;
for(int i=0;i<n;i++)
{
ListNode temp=new ListNode(sc.nextInt());
p.next=temp;
p=p.next;
}
int target=sc.nextInt();
ListNode result=partition(list.next,target);
while(result!=null)
{
System.out.print(result.val+" ");
result=result.next;
}
}
}