对链表排序有许多种算法,如
1、开辟一个数组保存链表中的值,排序然后再去重组链表,
2、遍历链表,找出最小的值保存,然后删除该值得节点,然后创建新的链表链接上该值
等等...
这些都是用空间换取时间
而今天我将所以新的算法,利用时间换去空间得算法(利用双指针对链表进行排序)
利用双指针对链表进行排序

首先创建指针,将head得中保存的地址赋给两个指针

如果cur节点中得值小于hp得值,就进行交换节点中数据,然后再移动cur到下一节点;

交换后未移动
否则cur只移动,不进行数据交换

未交换得移动
cur从头遍历到NULL为一次循环;
然后找出次小数据
使hp移动到下一个节点

hp=hp->next;
将hp中保存得地址赋给cur

cur=hp;
重复以上步骤,直到hp->next未空指针停止循环操作;

此刻链表中的数据全部排序完毕

空间复杂度为O(1):只创建了排序所利用得2个指针得大小得空间;
时间复杂度为O(N^2):排最小,遍历长度为N ;
排次小,遍历长度N-1
排再次小,遍历长度N-2
.........
最后一次,长度为1
所以N+N-1+N-2+N-3+...+1为N(1+N)/2==>O(N^2);
接口代码
void SListsort(SL**head)
{
SL* ph = *head;
while (ph->next)
{
SL* cur = ph;
while (cur)
{
if (cur->date < ph->date)
{
Swap(&cur->date, &ph->date);
}
cur = cur->next;
}
ph=ph->next;
}
}
谢谢大家,图画的很烂,如有不足之处,望大佬指点一二