[leetcode]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

题意:给了一个链表和一个值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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值