单链表实现快排

来源:互联网 发布:花衣吹笛手 知乎 编辑:程序博客网 时间:2024/05/21 01:47

地址的地址,即指针的指针,懂不懂?


思想:将一个链表分为两个链表,然后递归分解,再合并!

#include <iostream>using namespace std;struct ListNode {     int val;     ListNode *next;     ListNode(int x) : val(x), next(NULL) {}  };class Solution {public:    void QuickSort(ListNode *&head,ListNode *&end){        ListNode *begin1,*begin2,*end1,*end2;        begin1=begin2=end1=end2=NULL;        if(head==NULL)            return;        ListNode *p;        p=head->next;        head->next=NULL;        while(p!=NULL){            if(p->val < head->val){                if(!begin1) {                    begin1=end1=p;                    p=p->next;                    end1->next=NULL;                }                else{                    end1->next=p;                    end1=p;                    p=p->next;                    end1->next=NULL;                }            }            else{                if(!begin2) {                        begin2=end2=p;                        p=p->next;                        end2->next=NULL;                }                else{                    end2->next=p;                    end2=p;                    p=p->next;                    end2->next=NULL;                }            }        }        QuickSort(begin1,end1);        QuickSort(begin2,end2);        if(end1 && begin2){            end1->next = head;            head->next= begin2;            head=begin1;            end=end2;        }else if(end1){           end1->next = head;           end=head,head=begin1;        }else if(begin2){            head->next=begin2;            end=end2;        }    }    ListNode *sortList(ListNode *head) {        ListNode *p=head;        if(p==NULL || p->next==NULL) return head;        while(p->next != NULL){            p=p->next;        }        QuickSort(head,p);        return head;    }};void present(ListNode *head){    ListNode *p=head;    while(p!=NULL){        cout<<p->val<<' ';        p=p->next;    }    cout<<endl;}int main(){    Solution SS;    ListNode *head;    ListNode list1(1);    ListNode list2(2);    ListNode list3(1);    head=&list1;    list1.next=&list2;    list2.next=&list3;    present(head);    head=SS.sortList(head);    present(head);    //cout << "Hello world!" << endl;    return 0;}


0 0
原创粉丝点击