题目:
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.
本体是要将一个链表分为两部分,一个是比x大的,一个是比x小的。但是并不需要重新排序,而要保持元素间的相对位置。有两种思路,一种是使用两个链表分别保存比x大的,小的元素,然后再拼接在一起,另外一种思路不需要使用额外的存储空间,使用in-place方式。代码入下:
//方法一
public ListNode partition1(ListNode head, int x) {
//重新定义两个链表,分别保存较大值和较小值,其元素顺序与原链表相对位置保持一致
ListNode dummy1 = new ListNode(0), dummy2 = new ListNode(0);
ListNode curr1 = dummy1, curr2 = dummy2;
while (head!=null){
if (head.val<x) {
curr1.next = head;
curr1 = head;
}else {
curr2.next = head;
curr2 = head;
}
head = head.next;
}
//较大的链表最后要指向空,并将其放在较小的链表后面
curr2.next = null;
curr1.next = dummy2.next;
return dummy1.next;
}
//方法二,in-place方式
public static ListNode partition(ListNode head, int x) {
if(head == null || head.next == null)
return head;
ListNode pre = new ListNode(0);
pre.next = head;
ListNode small=pre, cur=head, big=head;
while(cur != null && cur.val < x){
small = cur;
cur = cur.next;
}
while(cur != null){
if(cur.val < x){
big.next = cur.next;
cur.next = small.next;
small.next = cur;
small = cur;
cur = big.next;
}else {
big = cur;
cur = cur.next;
}
}
return pre.next;
}