leetcode做题总结,题目Partition List 2012/04/30

本文详细介绍了链表分区算法的优化过程,包括指针i和j的使用技巧,确保链表前部分数小于指定值,后部分数大于等于该值。优化了元素重复遍历的问题,并提供了代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目是设置一个值X,然后将链表前部保持全部小于这个值,后面的大于等于这个值。有点类似于快速排序的partiton,方法是用指针i历遍寻找大于等于x的节点,然后从这里开始使用j向后历遍寻找小于X的节点,然后交换即可。然后i继续向后。


特别注意一下节点的历遍一定要检查节点是否为空,同时判断语句的多个判定条件由前往后判断,比如while(j.next!=null&&j.next.val>=x)里面两个判定条件的顺序不能改变。


public ListNode partition(ListNode head, int x) {
        if(head==null||head.next==null)return head;
        ListNode h,i,j,k;
        h = new ListNode(0);
        h.next=head;
        i=h;
        j=h;
        while(i.next!=null){
            while(i.next!=null&&i.next.val<x)i=i.next;
            if(i.next==null)return h.next;
            j=i;
            while(j.next!=null&&j.next.val>=x)j=j.next;
            if(j.next==null)return h.next;
            k=i.next;
            i.next=j.next;
            j.next=j.next.next;
            i.next.next=k;
            
        }
        return h.next;
    }

Update 2015/08/25: 上面的解法还有优化的地方,j每次都从i开始会有元素被重复历遍。由于i永远都会被卡在第一个大于等于x的位置,所以i只需要查找一点即可,然后j从i开始不停地历遍然后把小于X的元素放到前面即可。由于题目要求不能改变order,所以上面使用的是插入而不是交换


/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param head: The first node of linked list.
     * @param x: an integer
     * @return: a ListNode 
     */
    public ListNode partition(ListNode head, int x) {
        // write your code here
        if(head==null||head.next==null)return head;  
        ListNode h,i,j,k;  
        h = new ListNode(0);  
        h.next=head;  
        i=h;  
        j=h;  
        
        while(i.next!=null&&i.next.val<x)i=i.next;  
        if(i.next==null)return h.next;  
        j=i;
        
        while( j.next != null){  
            while(i.next!=null&&i.next.val<x)i=i.next;  
            if(i.next==null)return h.next;  
            //j=i;  
            while(j.next!=null&&j.next.val>=x)j=j.next;  
            if(j.next==null)return h.next;  
            k=i.next;  
            i.next=j.next;  
            j.next=j.next.next;  
            i.next.next=k; 
            i = i.next;
        }  
        return h.next;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值