[leetcode]Partition List

来源:互联网 发布:js window.open 编辑:程序博客网 时间:2024/06/16 18:54

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;    }


0 0