链表划分

来源:互联网 发布:php开源管理后台框架 编辑:程序博客网 时间:2024/05/23 15:36

给定一个单链表和数值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;     }     }}



原创粉丝点击