Partition List

##题目

####Partition List

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.

##解题思路
本题主要是链表操作,这里为了实现指针的变化,维护两个指针i,j使得i.next==j,让这两个指针一起推进,并用指针k始终指向比x小的元素序中的最后一个元素位置。如果j指的元素比x小,则该元素应该放到k后面。这里只要进行指针指向的变换操作。如果j指的元素比x大,则将i,j往前推进。依次处理直到j==null

这里有个细节需要判定,当j指的元素比x小时,如果k==i,说明j就是下一个比x小的元素,则不用变换指针操作,直接i=i.next,j=j.next,k=k.next即可。

##算法代码
代码采用JAVA实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/

public class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null || head.next==null)
return head;
ListNode newhead=new ListNode(0);
newhead.next=head;
ListNode k=newhead;
ListNode i=newhead;
ListNode j=head;
while(j!=null)
{
if(j.val>=x)
{
j=j.next;
i=i.next;
}else{
if(k==i){ //说明j就是下一个比X小的元素
i=i.next;
j=j.next;
k=k.next;
}else{ //将j移到k的后面
ListNode tmp=j;
i.next=j.next;
j=j.next;
tmp.next=k.next;
k.next=tmp;
k=k.next;
}
}
}
return newhead.next;
}
}

Comments