1.链表排序
1>参数:链表
2>返回值:void
3>函数代码如下:
//排序
void list_sort(NodePtr L)
{
if (L == NULL || L->next == NULL)
{
printf("排序失败\n"); // 空链表或只有一个节点的链表,无需排序
return;
}
NodePtr p = L->next; // p指向第一个需要排序的节点
L->next = L->next->next; // 假设第一个节点是已排序的,将其从待排序链表中移除
p->next = NULL; // 断开p的链接,使其成为独立节点
while (p != NULL)
{
NodePtr q = L; // q用于遍历已排序的链表
NodePtr prev = NULL; // prev用于记录q的前一个节点
// 寻找p应该插入的位置
while (q != NULL && q->data < p->data)
{
prev = q;
q = q->next;
}
// 插入p到正确位置
p->next = q;
if (prev == NULL)
{
// 插入到链表头部
L->next = p;
}
else
{
prev->next = p;
}
// 处理下一个待排序节点
NodePtr next_p = p->next; // 保存p的下一个节点
p->next = NULL; // 断开p的链接,准备下一次循环
p = next_p; // 移动到下一个待排序节点
}
printf("排序成功\n");
}
2.链表的反转(递归实现)
1>参数:链表
2>返回值:链表
3>函数代码如下:
//将链表进行翻转(递归版)
NodePtr list_un_reverse(NodePtr L)
{
if(L == NULL || L->next==NULL)
{
return L;
}
NodePtr p=list_un_reverse(L->next);
L->next->next=L;
L->next=NULL;
return p;
}
3.链表去重
1>参数:链表
2>返回值:void
3>函数代码如下:
//去重
void list_qu(NodePtr L)
{
if(NULL==L || list_empty(L))
{
printf("去重失败\n");
return;
}
NodePtr mark=NULL;
NodePtr p=NULL;
NodePtr q=NULL;
for(mark=L->next;mark!=NULL;mark=mark->next)
{
q=mark;
p=mark->next;
while(p)
{
if(mark->data==p->data)
{
q->next=p->next;
free(p);
p=q->next;
}else
{
q=p;
p=p->next;
}
}
}
printf("去重成功\n");
}