对于单链表的逆置有两种方法可以实现:

(1)利用辅助指针

基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。

实现代码:

[cpp] view plaincopy print?
  1. typedef int DataType; //类型定义
  2. typedef struct node{  //单链表定义
  3. DataType data;
  4. struct node* next;
  5. }LinkedNode,*LinkList;
  6. void ReverseList(LinkList& ListHead)
  7. {
  8. cout<<"Begin to Reverse the List"<<endl;
  9. if( (NULL==ListHead)||(NULL==ListHead->next) )return ;  //边界检测
  10. LinkedNode* pPre=ListHead;    //先前指针
  11. LinkedNode* pCur=pPre->next;  //当前指针
  12. LinkedNode* pNext=NULL;       //后继指针
  13. while(pCur!=NULL)
  14. {
  15. pNext=pCur->next;
  16. pCur->next=pPre;
  17. pPre=pCur;
  18. pCur=pNext;
  19. }
  20. ListHead->next=NULL;
  21. ListHead=pPre;        //记录下新的头结点
  22. }

示意图:

(2)递归

基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。

实现代码:

写了两个版本

I、返回值为空

[cpp] view plaincopy print?
  1. void ReverseList(LinkedNode* pCur,LinkList& ListHead)
  2. {
  3. if( (NULL==pCur)||(NULL==pCur->next) )
  4. {
  5. ListHead=pCur;
  6. }
  7. else
  8. {
  9. LinkedNode* pNext=pCur->next;
  10. ReverseList(pNext,ListHead); //递归逆置后继结点
  11. pNext->next=pCur;            //将后继结点指向当前结点。
  12. pCur->next=NULL;
  13. }
  14. }

II、返回值为结点类型

[cpp] view plaincopy print?
  1. LinkedNode* ReverseList(LinkedNode* pCur,LinkList& ListHead)
  2. {
  3. cout<<"Begin to Reverse the List"<<endl;
  4. if( (NULL==pCur)||(NULL==pCur->next) )
  5. {
  6. ListHead=pCur;
  7. return pCur;
  8. }
  9. else
  10. {
  11. LinkedNode* pTemp=ReverseList(pCur->next,ListHead); //递归逆置后继结点
  12. pTemp->next=pCur;   //将后继结点指向当前结点
  13. pCur->next=NULL;
  14. return pCur;
  15. }
  16. }

示意图:

下面给出完整的程序:

[cpp] view plaincopy print?
  1. #include<iostream>
  2. using namespace std;
  3. const int N=6;
  4. typedef int DataType;//类型定义
  5. typedef struct node{ //单链表
  6. DataType data;
  7. struct node* next;
  8. }LinkedNode,*LinkList;
  9. /****由数组创建单链表****/
  10. LinkList CreateList(DataType a[N])
  11. {
  12. LinkedNode* ListHead=new LinkedNode();
  13. ListHead->data=a[0];
  14. ListHead->next=NULL;
  15. for(int i=N-1;i>=1;i--)
  16. {
  17. LinkedNode* p=new LinkedNode();
  18. p->data=a[i];
  19. p->next=ListHead->next;
  20. ListHead->next=p;
  21. }
  22. return ListHead;
  23. }
  24. /****输出单链表****/
  25. void PrintList(LinkList ListHead)
  26. {
  27. if(NULL==ListHead)cout<<"The List is empty!"<<endl;
  28. else
  29. {
  30. LinkedNode* p=ListHead;
  31. while(p!=NULL)
  32. {
  33. cout<<p->data<<" ";
  34. p=p->next;
  35. }
  36. cout<<endl;
  37. }
  38. }
  39. void ReverseList(LinkedNode* pCur,LinkList& ListHead)
  40. {
  41. if( (NULL==pCur)||(NULL==pCur->next) )
  42. {
  43. ListHead=pCur;
  44. }
  45. else
  46. {
  47. LinkedNode* pNext=pCur->next;
  48. ReverseList(pNext,ListHead); //递归逆置后继结点
  49. pNext->next=pCur;            //将后继结点指向当前结点。
  50. pCur->next=NULL;
  51. }
  52. }
  53. int main()
  54. {
  55. int a[N]={1,2,3,4,5,6};
  56. LinkedNode* list=CreateList(a);
  57. PrintList(list);
  58. LinkedNode*pTemp=list;
  59. ReverseList(pTemp,list);
  60. PrintList(list);
  61. return 0;
  62. }

单链表的逆置-C++实现(ok)相关推荐

  1. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  2. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

  3. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

  4. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  5. 有头结点单链表的逆置

    [问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...

  6. (二十四) 单链表的逆置(java)

    前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧. 参考博客:点击打开链接 demo地址:我的github 1. 单链表 先写一个简单的单链表,改写一下它的toS ...

  7. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

  8. java实现单链表就地逆置,单链表的就地逆置讲解

    { List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...

  9. java实现单链表就地逆置,20. 微软面试题:单链表就地逆放

    题目是:链表操作,单链表就地逆置 分析: 这题只需要设置三个指针就搞定了,ListNode* p 表示当前指针, ListNode* fp: 上一个节点指针, ListNode * ep :下一个节点 ...

最新文章

  1. ActionDescriptor 的认识
  2. 字节跳动面试题:“请你描述下 Spring Bean 的生命周期?”
  3. 第十一章 串 (b2)蛮力匹配
  4. v3s 全志_基于全志V3s的开源开发板,提供pcb和系统源码和资料
  5. excel表头_如何用Excel制作出库入库表
  6. ASP.NET Core File Providers
  7. 最强动画制作人书包_声优访谈丨恋与制作人动画中配声优访谈——夏磊
  8. MacOS emacs Command “pyls“ is not present on the path.报错及解决
  9. 判断点是否在一个矩形内
  10. php mysql 读写删改_PHP+MYSQL实现用户的增删改查
  11. 如何使用Java逐行读取大文本文件?
  12. 移动100m宽带慢的要死_【今日小知识】卡吗?慢吗?移动千兆路由器带你飞
  13. 文件查找命令 - find
  14. 虚拟机 Debian 11 安装moodle3.11
  15. 360Hbase二级索引
  16. php 用户控件,一个使用用户控件(包括组件)的演示-.NET教程,组件控件开发
  17. html5 五线谱,五线谱难学?5分钟完成五线谱入门
  18. 微信小程序自定义组件使用阿里矢量图标库图标
  19. 大数据分析-考试复习
  20. win7系统安装信息服务器不可用怎么办,Win7系统RPC服务器不可用怎么办?

热门文章

  1. 旧的非flash版Metalink的入口
  2. 现实迷途 第二十五章 重见故人
  3. ARP过程——删除地址映射
  4. 分享一些很不错的学习资源网站
  5. zookeeper之理论基础
  6. java如何算log_用java代码计算Log(a)b
  7. 工作两年总结(一句话)
  8. 解决开始时cmd进入dos中ping会提示未出现在内部文件中
  9. 有关文档流的一些注意事项
  10. java 执行查询_在单个语句中用Java执行多个查询