您的位置:首页 > 职场人生

[leetcode]Partition List

2014-03-23 02:19 323 查看
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值的节点前面来

一开始我没看清楚题,这个题陈述的让人得仔细看一眼。 看例子来说,让所有小于3的点,都到4前面来,因为4比三大

思路:

先说小于x的点怎么办,那只能是走到2的前面的点,看看next.val是不是小于x,小于了x就把它弄出来,让x指向这个点的后面一个点

然后,把它从前面找,直到找到一个大于等于3的点,放在这个点前面。

那么关键就在于,从哪个点分割?我们首先得找到一个分割的点。 所以遍历一遍链表,直到下一个点的值比x大,那么我们就从这点的后面开始找小于x的点,这个点就是分割点。从这个点开始,不断的查看下一个点的大小,大的跳过,向前进一个节点,小的就切出去,弄到前面去。

public ListNode partition(ListNode head, int x) {
if(head==null) return null;
//traversal
ListNode tar=head;
while(tar.val<x&&tar.next!=null) tar=tar.next;

ListNode fakehead=new ListNode(0);
fakehead.next=head;
ListNode temp=null;
while(tar.next!=null){
if(tar.next.val<x){
temp=tar.next;
tar.next=tar.next.next;
temp.next=null;
}
else tar=tar.next;
//has fetched that node, then
ListNode start=fakehead;
if(temp!=null){
while(start.next.val<x){
start=start.next;

}
ListNode larger=start.next;
start.next=temp;
temp.next=larger;
}

}

return fakehead.next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode java 面试题