中文版:
给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
你应该保留两部分内链表节点原有的相对顺序。
样例
给定链表 1->4->3->2->5->2->null,并且 x=3
返回 1->2->2->4->3->5->null
English Version
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of the nodes in each of the two partitions.
For example,
Given 1->4->3->2->5->2->null and x = 3,
return 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) {
if(null == head || head.next == null) return head;
ListNode node = new ListNode(Integer.MIN_VALUE);
node.next = head;
head = node;
ListNode p = head, q = head;
while(null != q && q.val < x){//找到大于等于x的节点
q = q.next;
}
if(null == q) return head.next;//所有节点值均小于x
while(p.next != q) {//p指向q的上一个节点
p = p.next;
}
while(null != q.next) {//q遍历链表,将值小于x的节点顺次移到p后面
if(q.next.val < x) {
ListNode l = q.next;
q.next = q.next.next;
l.next = p.next;
p.next = l;
p = p.next;
continue;
}
q = q.next;
}
return head.next;
}
}