您的位置:首页 > 其它

单链表实现快排

2014-11-18 21:44 134 查看
地址的地址,即指针的指针,懂不懂?

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表 快排