http://blog.csdn.net/lfeng_coding/article/details/47300563

题目描述:在已知单链表头节点的情况下,设计算法逆置单链表并输出

方法一:采用首先将头节点指向空,让其变为尾节点,然后利用中间节点 p、q 将其后的节点一个接一个改为指向前面的节点

/****************************

*作者:刘峰

* 时间:2015\8\5

* 环境:VS2013

* 功能:实现创建一个节点可控的单链,并逆置输出

****************************/

[cpp] view plain copy
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. struct List
  5. {
  6. int num;
  7. List *next;
  8. };
  9. List *createList(int n)       //创建含有n个节点的单链表
  10. {
  11. List *head, *p, *q;
  12. q=head = NULL;   //初始化表头和中间指针
  13. int i;
  14. for (i = n; i > 0; --i)
  15. {
  16. p = new List;     //申请空间,创建第一个节点
  17. cin >> p->num;      //往节点中存入数据信息
  18. if (head == NULL)
  19. {
  20. head = p;
  21. }
  22. else
  23. {
  24. q->next = p;
  25. }
  26. q = p;
  27. }
  28. q->next = NULL;
  29. return head;
  30. }
  31. List *ReverseList(List *head)          //逆置单链表
  32. {
  33. List *p, *r;       //定义两个中间节点,用于顺移逆置链表节点
  34. if (head->next == NULL)
  35. return head;
  36. p = head;          //获取头节点地址
  37. r = p->next;       //获取链表第二个节点地址
  38. p->next = NULL;    //头节点变为尾节点,原链表表头指向空
  39. while (r)
  40. {
  41. p = r;
  42. r = r->next;
  43. p ->next = head;   //使第二个节点指向原先的头节点
  44. head = p;          //使第二个节点变为头节点,用于循环逆置
  45. }
  46. return head;
  47. }
  48. void print(List *head)        //输出逆置后的单链表
  49. {
  50. List *p;
  51. p = head;
  52. while (p)
  53. {
  54. cout<<p->num;
  55. p = p->next;
  56. cout << " ";
  57. }
  58. cout << endl;
  59. }
  60. int _tmain(int argc, _TCHAR* argv[])
  61. {
  62. List *p, *q;
  63. cout << "请输入单链表的节点个数:";
  64. int n;
  65. cin >> n;
  66. cout << endl;
  67. cout << "创建一个节点为" << n << "的单链表" << endl;
  68. p = createList(n);
  69. cout << endl;
  70. cout << "这步为程序逆置单链表" << endl;
  71. q = ReverseList(p);
  72. cout << endl;
  73. cout << "打印逆置后的单链表" << endl;
  74. print(q);
  75. cout << endl;
  76. return 0;
  77. }

方法二:用p,q指向单链表中相邻的两节点,将r指向q的下一个结点,然后同步后移。当q=NULL时,表示指向原单链表的尾结点,将p赋值为头节点 head 即可。

逆置函数代码如下(其他部分不变):

List *ReverseList(List *head)
{
List *p, *q, *r;
p = head;
if (p->next == NULL)
return head;
q = p->next;
while (q != NULL)     //q为空,说明p为最后一个节点,所以结束while后将q赋值给head,作为逆置后的表头
{
r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = NULL;   //将原head变为逆置后链表的表尾
head = p;            //逆置后新的表头
return head;
}

用C++实现单链表的创建、逆置和输出 的两种方法相关推荐

  1. 对单链表实现就地逆置

    对单链表实现就地逆置 /* 对单链表实现就地逆置 */ #include <stdio.h> #include "malloc.h"typedef struct LNo ...

  2. 借助栈实现单链表的原地逆置

    借助栈实现单链表的原地逆置 [问题描述]首先建立一个单链表,通过栈实现该链表的原地逆置,注意仅使用链表中的原有的结点空间,结点的数据成员为int型.注意这个题需要单链表和栈两个类. [输入形式]输入只 ...

  3. 【单链表】单链表的就地逆置

    编写算法实现带头结点单链表seqlist的就地逆置,即利用原带头结点单链表seqlist的结点空间,把数据元素顺序排反 题目分析: 在前面2-18讲了顺序表的就地逆置,但单链表的就地逆置与顺序表有所不 ...

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

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

  5. c语言字符就地逆置,高手看看我的C语言代码单链表实现就地逆置

    高手看看我的C语言代码单链表实现就地逆置 单链表实现就地逆置#include #include struct type{ int date; struct type * next;}first;int ...

  6. 对带头结点的单链表实现就地逆置的算法分析

    试写一算法,对单链表实现就地逆置. 实现下列函数: void Inverse(LinkList &L);  /* 对带头结点的单链表L实现就地逆置 */ 单链表类型定义如下: typedef ...

  7. 用new创建一个二维数组,有两种方法,是等价的

    //用new创建一个二维数组,有两种方法,是等价的      一:      int   (*p)[10]   =   new   int[5][10];      二:      int   **p ...

  8. python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...

    链表问题大全!!!刚出炉的还热乎呢!! #include #include typedef struct node { int nDate; struct node *pstnext; }Node; ...

  9. 单链表反转(逆置)——(四种方法实现)

    链表逆置就是把最后一个数据提到最前面,倒数第二个放到第二个--依次类推,直到第一个到最后一个. 由于链表没有下标,所以不能借助下标来实行数据的逆置,要靠空间的转移来完成链表的逆置,这里采用没有头节点的 ...

最新文章

  1. vue修改计算属性的值_vue之计算属性
  2. ORACLE的analyze及生成方式
  3. 数据库原理 知识点总结
  4. GdiPlus[30]: IGPPen: 线帽
  5. Java Stream:第2部分,计数始终是计数吗?
  6. 64位CentOS6.2安装erlang及rabbitmqServer
  7. 282. Expression Add Operators
  8. HTML解析没有详情页url,爬虫找不到详情页URL的参数
  9. mysql gman do_使用MySQL UDFs来调用gearman分布式任务分发系统
  10. 本来都对象棋失去兴趣了, 是特殊的原因让我又开始从侧面搞象棋方面的擦边的游戏...
  11. 基于SSM框架开发的社区疫情管理系统 附带详细运行指导视频
  12. paraview:python脚本
  13. SolidWorks软件远程安装协助
  14. 如何利用树莓派制作路由器
  15. BADI 和BAPI 的区别
  16. 超常用的Python代码片段 | 备忘单
  17. SCT2330CTVBR
  18. Docker集群(一) —— Docker网络及flannel介绍
  19. 阅读感悟《给中年程序员的温暖人心的巴比奇的故事》
  20. 为什么我的世界服务器显示红叉,小学生在试卷上答题画《我的世界》合成表?玩家:玩MC上头了!...

热门文章

  1. jquery获得下拉框的值
  2. 即时聊天IM之二 openfire 整合现有系统用户
  3. Redis-主从复制
  4. Jquery 寻找父、子、兄弟节点
  5. 服务器角色与数据库角色
  6. vue lang_新疆人的“lang”是“浪”吗?
  7. windows 检查cuda安装_Windows云主机GPU驱动-CUDA安装使用
  8. 卡方线性趋势检验_SPSS:趋势卡方检验
  9. 常见问题_智能切膜机常见问题
  10. android dropbox anr分析,Android如何分析排查ANR