单链表实现快排
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;
}
思想:将一个链表分为两个链表,然后递归分解,再合并!
#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;
}
相关文章推荐
- 单链表的实现和基本操作
- 不用辅助节点,实现单链表的反转。
- 我用c++实现的模板单链表类.并用一个一元多项式进行测试.
- 用java实现单链表
- 数据结构单链表实现插入删除查找
- 单链表的操作实现
- 在单链表的基础上用c++实现的链栈,并使用进制转换,表达式求值两个小程序来测试
- 单链表的手动实现
- 关于栈的一个算法(实现单链表的倒置)
- 不用辅助节点,使用_asm{}实现单链表的反转。
- 基于单链表的列表基本操作 类C语言实现
- 单链表的实现及其操作
- 单链表,实现逆转
- 2.4-其它运算在单链表上的实现
- 利用栈来实现单链表的逆序
- 单链表的C++代码实现
- 顺序表的链式结构中用C语言实现单链表的交并差运算
- 用类实现单链表操作
- 数据结构实现单链表
- LUA实现单链表