单链表冒泡排序非赋值转换
- 先判断链表是不是空或者只有一个结点,这两种情况直接返回,无需排序。
- 初始化p1 p2 p3 在每趟排序过程结束后保证p1 p3结点在 p2结点前面,并且保证head标识头节点,每一内循环结束,p1 p2都要初始化指向头节点和头节点下一个。
- 需要交换的有两种情况,一 是第一个结点与第二节点交换,二 是中间结点之间的交换(p3就是用来处理这种情况的)。
- 根据不同情况交换结点的指向,完成排序,返回头节点。
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;
}