当前位置:   article > 正文

数据结构——链表(排序、递归反转、去重)_链表排序

链表排序

1.链表排序

1>参数:链表

2>返回值:void

3>函数代码如下:

  1. //排序
  2. void list_sort(NodePtr L)
  3. {
  4. if (L == NULL || L->next == NULL)
  5. {
  6. printf("排序失败\n"); // 空链表或只有一个节点的链表,无需排序
  7. return;
  8. }
  9. NodePtr p = L->next; // p指向第一个需要排序的节点
  10. L->next = L->next->next; // 假设第一个节点是已排序的,将其从待排序链表中移除
  11. p->next = NULL; // 断开p的链接,使其成为独立节点
  12. while (p != NULL)
  13. {
  14. NodePtr q = L; // q用于遍历已排序的链表
  15. NodePtr prev = NULL; // prev用于记录q的前一个节点
  16. // 寻找p应该插入的位置
  17. while (q != NULL && q->data < p->data)
  18. {
  19. prev = q;
  20. q = q->next;
  21. }
  22. // 插入p到正确位置
  23. p->next = q;
  24. if (prev == NULL)
  25. {
  26. // 插入到链表头部
  27. L->next = p;
  28. }
  29. else
  30. {
  31. prev->next = p;
  32. }
  33. // 处理下一个待排序节点
  34. NodePtr next_p = p->next; // 保存p的下一个节点
  35. p->next = NULL; // 断开p的链接,准备下一次循环
  36. p = next_p; // 移动到下一个待排序节点
  37. }
  38. printf("排序成功\n");
  39. }

 

2.链表的反转(递归实现)

1>参数:链表

2>返回值:链表

3>函数代码如下:

  1. //将链表进行翻转(递归版)
  2. NodePtr list_un_reverse(NodePtr L)
  3. {
  4. if(L == NULL || L->next==NULL)
  5. {
  6. return L;
  7. }
  8. NodePtr p=list_un_reverse(L->next);
  9. L->next->next=L;
  10. L->next=NULL;
  11. return p;
  12. }

 

 3.链表去重

1>参数:链表

2>返回值:void

3>函数代码如下:

  1. //去重
  2. void list_qu(NodePtr L)
  3. {
  4. if(NULL==L || list_empty(L))
  5. {
  6. printf("去重失败\n");
  7. return;
  8. }
  9. NodePtr mark=NULL;
  10. NodePtr p=NULL;
  11. NodePtr q=NULL;
  12. for(mark=L->next;mark!=NULL;mark=mark->next)
  13. {
  14. q=mark;
  15. p=mark->next;
  16. while(p)
  17. {
  18. if(mark->data==p->data)
  19. {
  20. q->next=p->next;
  21. free(p);
  22. p=q->next;
  23. }else
  24. {
  25. q=p;
  26. p=p->next;
  27. }
  28. }
  29. }
  30. printf("去重成功\n");
  31. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号