题目是设置一个值X,然后将链表前部保持全部小于这个值,后面的大于等于这个值。有点类似于快速排序的partiton,方法是用指针i历遍寻找大于等于x的节点,然后从这里开始使用j向后历遍寻找小于X的节点,然后交换即可。然后i继续向后。
特别注意一下节点的历遍一定要检查节点是否为空,同时判断语句的多个判定条件由前往后判断,比如while(j.next!=null&&j.next.val>=x)里面两个判定条件的顺序不能改变。
public ListNode partition(ListNode head, int x) {
if(head==null||head.next==null)return head;
ListNode h,i,j,k;
h = new ListNode(0);
h.next=head;
i=h;
j=h;
while(i.next!=null){
while(i.next!=null&&i.next.val<x)i=i.next;
if(i.next==null)return h.next;
j=i;
while(j.next!=null&&j.next.val>=x)j=j.next;
if(j.next==null)return h.next;
k=i.next;
i.next=j.next;
j.next=j.next.next;
i.next.next=k;
}
return h.next;
}
Update 2015/08/25: 上面的解法还有优化的地方,j每次都从i开始会有元素被重复历遍。由于i永远都会被卡在第一个大于等于x的位置,所以i只需要查找一点即可,然后j从i开始不停地历遍然后把小于X的元素放到前面即可。由于题目要求不能改变order,所以上面使用的是插入而不是交换
/**
* 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 h,i,j,k;
h = new ListNode(0);
h.next=head;
i=h;
j=h;
while(i.next!=null&&i.next.val<x)i=i.next;
if(i.next==null)return h.next;
j=i;
while( j.next != null){
while(i.next!=null&&i.next.val<x)i=i.next;
if(i.next==null)return h.next;
//j=i;
while(j.next!=null&&j.next.val>=x)j=j.next;
if(j.next==null)return h.next;
k=i.next;
i.next=j.next;
j.next=j.next.next;
i.next.next=k;
i = i.next;
}
return h.next;
}
}