当前位置:   article > 正文

C语言实现——反转链表_c语言 链表翻转

c语言 链表翻转
     力扣题号:206. 反转链表

一、题目描述

反转一个单链表,要求不能申请额外的内存空间。

二、示例

输入:1→2→3→4→5→6→NULL

输出:6→5→4→3→2→1→NULL

三、求解思路

实现对单链表的反转,有三种方法,分别为:双指针法,递归法,头插法。其中,头插法是对当前链表中的所有元素再进行一次头插法,实现链表的反转。

四、代码实现

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef struct Lnode {
  5. int data;
  6. struct Lnode* next;
  7. }Lnode, * Linklist;
  8. /*
  9. 头插法插入链表
  10. 参数说明
  11. L -- 传入链表
  12. x -- 结点上的数据
  13. */
  14. bool headInsert(Linklist& L, int x) {
  15. Lnode* newnode = (Lnode*)malloc(sizeof(Lnode));
  16. if (newnode == NULL) {
  17. return false;
  18. }
  19. newnode->data = x;
  20. newnode->next = L;
  21. L = newnode;
  22. return true;
  23. }
  24. /*
  25. 双指针法反转链表
  26. 参数说明
  27. L -- 传入链表
  28. */
  29. void doublePointerReverse(Linklist &L) {
  30. Lnode* cur = L;
  31. Lnode* pre = NULL;
  32. while (cur) {
  33. Lnode* tmp = cur->next;
  34. cur->next = pre;
  35. pre = cur;
  36. cur = tmp;
  37. }
  38. L = pre;
  39. }
  40. /*
  41. 递归法反转链表
  42. 参数说明
  43. L -- 传入链表
  44. */
  45. Lnode* reverse(Lnode* cur, Lnode* pre) {
  46. if (cur == NULL) {
  47. return pre;
  48. }
  49. Lnode* tmp = cur->next;
  50. cur->next = pre;
  51. return reverse(tmp,cur);
  52. }
  53. void recursionReverse(Linklist& L) {
  54. L = reverse(L,NULL);
  55. }
  56. /*
  57. 头插法法反转链表
  58. 参数说明
  59. L -- 传入链表
  60. */
  61. void headInsertionReverse(Linklist& L) {
  62. Lnode* head = NULL;
  63. while (L)
  64. {
  65. Lnode* tmp = L->next;
  66. // 将原链表中的结点插入新的链表中
  67. L->next = NULL;
  68. if (head != NULL) {
  69. L->next = head;
  70. }
  71. head = L;
  72. // 原链表向后移动
  73. L = tmp;
  74. }
  75. L = head;
  76. }
  77. /*
  78. 打印链表
  79. 参数说明
  80. L -- 传入链表
  81. */
  82. void print(Linklist L) {
  83. if (L == NULL) {
  84. return;
  85. }
  86. while (L) {
  87. printf("%3d", L->data);
  88. L = L->next;
  89. }
  90. printf("\n");
  91. }
  92. int main() {
  93. // 创建链表
  94. Linklist L = NULL;
  95. headInsert(L, 1);
  96. headInsert(L, 2);
  97. headInsert(L, 2);
  98. headInsert(L, 3);
  99. headInsert(L, 5);
  100. headInsert(L, 7);
  101. headInsert(L, 7);
  102. printf("Linklist:\n");
  103. print(L);
  104. // 双指针法
  105. printf("双指针法: \n");
  106. doublePointerReverse(L);
  107. print(L);
  108. // 递归法
  109. printf("递归法: \n");
  110. recursionReverse(L);
  111. print(L);
  112. // 头插法反转
  113. printf("头插法反转: \n");
  114. headInsertionReverse(L);
  115. print(L);
  116. return 0;
  117. }

五、运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/655919
推荐阅读
相关标签
  

闽ICP备14008679号