当前位置:   article > 正文

【数据结构与算法】对单链表实现就地逆置_单链表就地逆置

单链表就地逆置

前言

在学习数据结构与算法的链表知识点时,布置了一个有关链表转置操作的小作业,感觉主要难点就是需要实现就地逆置,很容易就会使用额外的空间来帮助这个单链表逆置。废话不多说,我们下面一起来看看题目是怎么样的。


题目以及要求

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


思想以及代码

这道题的主要难点就是要在不开辟新的空间的情况下和以及在保证链表不断的情况下,实现链表的逆置。

我解这道题的思路是:

  1. 计算链表L的长度(元素个数)

  1. 开始循环

  1. 使指针P指向最后一个节点(node -> next = null)

  1. 保证不断的情况下实现元素调换

  1. 进入下次循环

  1. 循环n - 1次后退出(n为链表L的长度)


code photo


diagrammatize


code

  1. //找到链表L的最后一个元素
  2. int * ListEnd(LinkList L){
  3.     LinkList *p;
  4.     p = first;
  5.     while(p){
  6.         p = p -> next;
  7.     }
  8.     return p;
  9. }
  10. //单链表的长度(元素个数)
  11. int ListLength(LinkList L){
  12.     LinkList p;
  13.     p = first;
  14.     int count = 0;
  15.     while(p){
  16.         p = p -> next; count ++;
  17.     }
  18.     return count;
  19. }
  20. //实现对单链表就地逆置
  21. void ListReverse{
  22.     int n;
  23.     //算出L的长度
  24.     n = LinkLength(L);
  25.     //使得p指向最后一个节点
  26.     p = ListEnd(L);
  27.     //q指向是p的前驱节点
  28.     // q -> next = p;
  29.     q = GetPrior(L,p);//该部分代码未给出
  30.     //进行n - 1 次循环
  31.     for(int i = 0; i < n - 1; i++){
  32.         p -> next = L -> next;
  33.         L -> next = q -> next;
  34.         //将q的指针域置空
  35.         q -> next = null;
  36.         //p指向q所指的指针
  37.         p = q;
  38.         //q所指的节点再次变成p的前驱节点
  39.         q -> next = p;
  40.     }
  41. }

结束语

因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

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

闽ICP备14008679号