leetcode第一刷_Partition List

来源:互联网 发布:免费健身软件2017 编辑:程序博客网 时间:2024/04/30 19:32

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


0 0
原创粉丝点击