单链表冒泡排序(改变指向)

单链表冒泡排序非赋值转换

  1. 先判断链表是不是空或者只有一个结点,这两种情况直接返回,无需排序。
  2. 初始化p1 p2 p3 在每趟排序过程结束后保证p1 p3结点在 p2结点前面,并且保证head标识头节点,每一内循环结束,p1 p2都要初始化指向头节点和头节点下一个。
  3. 需要交换的有两种情况,一 是第一个结点与第二节点交换,二 是中间结点之间的交换(p3就是用来处理这种情况的)。
  4. 根据不同情况交换结点的指向,完成排序,返回头节点。
Node *sort(Node *head)              //单链表冒泡排序
{
    int i=n-1;       //n代表有n个结点
    //p1 p2用来比较 p3用来标识p1前面一个结点
    Node *p1=head,*p2=head->next,*p3=p1;  
    if(head==NULL){
        printf("这个链表是空的\n");   
        return head;
    }
    if(head->next==NULL){   //只有一个结点就之间返回head
        printf("这个链表只有一个结点\n");  
        return head;
    }
  
    //冒泡排序
    while(i){  //外层
        p1=head;
        p2=p1->next;
        int j=i;
        while(j){  //内层
            if(p1->age>p2->age){  //如果大的话就交换p1 p2
                if(p1==head){  //头节点与第二个结点交换的情况
                    p1->next=p2->next;
                    p2->next=p1;
                    head=p2;	//把head放回第一个结点
                    //p1 换回到 p2 的前面
                    p1=head;	
                    p2=p2->next;
                }
                else{     //不是第一个跟第二个换的情况
                    p1->next=p2->next;
                    p2->next=p1;
                    p3->next=p2;
                    //p1 换回到 p2 的前面
                    p1=p2;
                    p2=p2->next;
                }
            }
            if(p2->next){ //如果p2后面还有结点就把p1、p2、p3往后挪
                p3=p1;
                p1=p1->next;
                p2=p2->next;
            }
            j--;
        }
        i--;
    }
    return head;
}

1.头节点与第二个结点交换的情况在这里插入图片描述
2.中间结点交换的情况

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值