首页 > 其他 > 详细

leetcode第一刷_Partition List

时间:2014-05-09 20:48:13      阅读:417      评论:0      收藏:0      [点我收藏+]

partition是快排的准备工作,被用在其他很多问题上,比如找满足某个条件的数之类的。

在数组中,可以一头一尾的指针依次置换,这样是不能保证源数组中的相对顺序的。链表中就不一样了,没办法拿到尾部的指针,只能从头部往后找,找到第一不满足partition条件的节点,即较大的数,然后再往后找较小数,把较小数的节点移到前面来,因此跟数组的做法还有个区别,链表的partition只有一个指针在做实际的移动,另一个指针一直保存的是插入的位置。

class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        if(!head || !head->next)
            return head;
        ListNode *left = head, *right = head, *pre1 = NULL, *pre2 = NULL;
        while(left&&left->val<x){
            pre1 = left;
            left = left->next;
        }
        right = left;
        while(right){
            while(right&&right->val>=x){
                pre2 = right;
                right = right->next;
            }
            if(right != left&&right){
                pre2->next = right->next;
                if(pre1 == NULL){
                    right->next = head;
                    head = right;
                }else{
                    right->next = pre1->next;
                    pre1->next = right;
                }
                pre1 = right;
                right = pre2->next;
            }
        }
        return head;
    }
};


leetcode第一刷_Partition List,布布扣,bubuko.com

leetcode第一刷_Partition List

原文:http://blog.csdn.net/u012792219/article/details/25398741

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!