链表排序

来源:互联网 发布:南京java培训学校 编辑:程序博客网 时间:2024/06/07 01:10
//冒泡排序struct node{    int val;    node * next;    node():next(NULL){}};int main(){    //输入链表的个数,和链表数据,并创建链表    node *head=NULL,*p=NULL;    int len;    cin>>len;    for(int i=0;i<len;i++){        node *new_node=new(node);        cin>>new_node->val;        if(head==NULL){            head=new_node;            p=head;        }        else{            p->next=new_node;            p=p->next;        }    }    //输入的链表    node *x=head;    while(x!=NULL){        cout<<x->val;        x=x->next;    }    cout<<endl;    //开始冒泡排序    for(int i=0;i<len-1;i++){        //单独判断头节点和它后面一个节点的大小关系        if(head->val>head->next->val){            node * pp=head;            head=head->next;            pp->next=head->next;            head->next=pp;        }        //记录前一个节点pre,和当前节点p(如果不单独判断头节点,那么pre==p==head,于是在交换节点时候有bug)        node *pre=head,*p=head;        for(int j=0;j<len-1-i;j++){            if(p->val>p->next->val){    //交换节点                pre->next=p->next;                p->next=pre->next->next;                pre->next->next=p;            }            else    //没有发生节点交换时,才需要更新p,否则,由于节点交换后p位置后移一位,所以就没有更新的必要了                p=p->next;            if(j>0) //更新前节点                pre=pre->next;        }        //观察排序过程        x=head;        while(x!=NULL){            cout<<x->val;            x=x->next;        }        cout<<endl;        //    }    return 0;}
原创粉丝点击