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
and x = 3,
return 1->2->2->4->3->5
.
将链表分为小于3和大于等于3两个链表,并将他们合并。注意:新链表的末尾要指向null
Source
public ListNode partition(ListNode head, int x) {
ListNode l1 = new ListNode(0);
ListNode l2 = new ListNode(0);
if(head == null || head.next == null) return head;
l1.next = head;
ListNode p,q;
q = l1;
p = head;
ListNode st = l2;
while(p != null){
if(p.val < x){
p = p.next;
q = q.next;
}
else{
st.next = p;
st = st.next;
q.next = p.next;
p = q.next;
}
}
st.next = null; //新链表如果由老链表改编 一定要记得最后置null 否则很容易出错并造成死循环
q.next = l2.next;
return l1.next;
}
Test
public static void main(String[] args){
ListNode a = new ListNode(1);
a.next = new ListNode(4);
a.next.next = new ListNode(3);
a.next.next.next = new ListNode(2);
a.next.next.next.next = new ListNode(5);
a.next.next.next.next.next = new ListNode(2);
ListNode b = new Solution().partition(a, 3);
while(b != null){
System.out.println(b.val);
b = b.next;
}
}