当前位置:   article > 正文

数据结构 -- 实现单链表的原地逆置_试写一算法,对单链表实现就地(原地)逆置。

试写一算法,对单链表实现就地(原地)逆置。

题目:

        编写算法将一个单链表逆置;

分析:

        第一种方法:修改头指针;

        第二种方法:通过该表的*next指针实现:定义三个指针*p,*pre,*r分别表示三个连续的结点;先用p->next=NULL断掉第一个结点的后继节点,用pre表示原来单链表中p的前驱结点,再用p->next指向pre,但同时p的后继结点会断开,所以需要用r来保存其后继结点。

功能函数代码:

画图理解:

        带头结点:

 

         不带头结点:

 完整代码(以带头结点为例):

  1. //原地逆置
  2. typedef struct lnode
  3. {
  4. int val;
  5. struct lnode* next;
  6. }lnode, * linklist;
  7. struct lnode* creatlist(int n)
  8. {//创建链表
  9. linklist L = new lnode;
  10. L->next = NULL;
  11. cout << "请输入" << n << "个数:";
  12. for (int i = 0; i < n; i++) {
  13. linklist p = new lnode;
  14. cin >> p->val;
  15. p->next = L->next;
  16. L->next = p;
  17. }
  18. return L;
  19. }
  20. void travelist(linklist& L)
  21. {//打印链表
  22. linklist p = L->next;
  23. if (p == NULL) {
  24. cout << "该链表为空!" << endl;
  25. return;
  26. }
  27. while (p!=NULL) {
  28. cout << setw(6) << p->val;
  29. p = p->next;
  30. }
  31. }
  32. void reverse(linklist& L)
  33. {//链表原地逆置函数
  34. //头插法
  35. linklist p;
  36. p=L->next;
  37. L->next = NULL; //断开头结点
  38. while (p!=NULL) {
  39. linklist tem = p->next; //保存p的后继结点
  40. p->next = L->next; //断开p的后继节点
  41. L->next = p; //p插入在头结点之后
  42. p = tem; //p更新为下一个要继续插入的结点,即原链表的后继节点
  43. }
  44. //修改*next指针
  45. //linklist pre = NULL;
  46. //linklist cur = L->next;
  47. //while (cur != NULL) {
  48. // linklist next = cur->next;
  49. // cur->next = pre;
  50. // pre = cur;
  51. // cur = next;
  52. //}
  53. //L->next = pre;
  54. //修改*next指针的另一种写法
  55. //linklist pre = NULL, p = NULL, r = NULL;
  56. //r = L->next;
  57. //while (r != NULL)
  58. //{
  59. // pre = p;
  60. // p = r;
  61. // r = r->next;
  62. // p->next = pre;
  63. //}
  64. //L->next = p;
  65. }
  66. int main()
  67. {//主函数
  68. int n;
  69. cout << "请输入链表的长度:";
  70. cin >> n;
  71. linklist L = new lnode;
  72. //linklist pre;
  73. L = creatlist(n);
  74. cout << "原链表为: ";
  75. travelist(L);
  76. cout << endl;
  77. reverse(L);
  78. cout << "原地逆置后:";
  79. travelist(L);
  80. cout << endl;
  81. }

 输出:

 参考了另一个博主的博客并做了些优化~

链接:https://blog.csdn.net/qq_40941722/article/details/94381637?utm_source=app&app_version=4.16.0https://blog.csdn.net/qq_40941722/article/details/94381637?utm_source=app&app_version=4.16.0

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

闽ICP备14008679号