http://blog.csdn.net/wangqing_12345/article/details/51757294

尾插法建立链表,带头结点
设链表节点为
typedef struct node {
    int data;
    struct node *next;
}node_t, *pnode_t;

要求将一带链表头List head的单向链表逆序。

分析:

1). 若链表为空或只有一个元素,则直接返回;

2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;

3). 重复2),直到q为空

4). 调整链表头和链表尾

示例:以逆序A->B->C->D为例,图示如下

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LEN 10
  5. typedef struct node {
  6. int data;
  7. struct node *pnext;
  8. } node_t, *pnode_t;
  9. pnode_t create_link()
  10. {
  11. int i;
  12. pnode_t phead;
  13. phead = (pnode_t)malloc(sizeof(node_t));
  14. if (phead == NULL) {
  15. printf("malloc fail.\n");
  16. exit(-1);
  17. }
  18. memset(phead, 0, sizeof(node_t));
  19. pnode_t ptail = phead;
  20. for (i = 0; i < LEN; i++) {
  21. pnode_t    pnew = (pnode_t)malloc(sizeof(node_t));
  22. if (pnew == NULL) {
  23. printf("malloc fail.\n");
  24. exit(-1);
  25. }
  26. memset(pnew, 0, sizeof(node_t));
  27. pnew->data = i+1;
  28. pnew->pnext = NULL;
  29. ptail->pnext = pnew;
  30. ptail = pnew;
  31. }
  32. return phead;
  33. }
  34. void print_link(pnode_t phead)
  35. {
  36. pnode_t p = phead->pnext;
  37. while (p != NULL) {
  38. printf("%d ", p->data);
  39. p = p->pnext;
  40. }
  41. printf("\n");
  42. }
  43. void reverse_link(pnode_t phead)
  44. {
  45. pnode_t p, q, ptmp;
  46. p = phead->pnext;
  47. q = phead->pnext->pnext;
  48. ptmp = NULL;
  49. while (q != NULL) {
  50. ptmp = q->pnext;
  51. q->pnext = p;
  52. p = q;
  53. q = ptmp;
  54. }
  55. phead->pnext->pnext = NULL;
  56. phead->pnext = p;
  57. }
  58. int main(int argc, char *argv[])
  59. {
  60. pnode_t phead = NULL;
  61. phead = create_link();
  62. print_link(phead);
  63. reverse_link(phead);
  64. print_link(phead);
  65. return 0;
  66. }

链表逆序的原理及实例相关推荐

  1. c语言将一个已知头结点的单链表逆序_C语言实现单链表逆序与逆序输出实例

    单链表的逆序输出分为两种情况,一种是只逆序输出,实际上不逆序:另一种是把链表逆序.本文就分别实例讲述一下两种方法.具体如下: 1.逆序输出 实例代码如下: #include #include #inc ...

  2. c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  3. 链表详解(单链表、双向链表、链表逆序)

    目录 线性表 顺序存储结构 链式存储结构 单链表 单链表定义 单链表基本操作(仅供参考) 实例 循环单链表的状态图 双向链表 双向链表定义 双向链表特点 双向链表基本操作(仅供参考) 实例 双向链表的 ...

  4. c语言实现单链表逆序算法,C语言解字符串逆序和单向链表逆序问题的代码示例...

    字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { ...

  5. 链表逆序(反转链表)

    链表逆序(反转链表) 一道很基础的算法题,做一下思路的分享和代码的实现,也算是自己学习的一份笔记,如有不正,请大佬们指正. class ListNode {int val;ListNode next; ...

  6. c语言实现链表的逆序输出,C语言数据结构实现链表逆序并输出

    C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...

  7. c语言递归链表逆序,链表逆序的递归实现

    链表逆序是个很基础的算法,考察的是指针操作和基本数据结构.常规的写法当然是OK的,不过要是还会写出一个递归的链表逆序算法,那别人肯定要给你点个赞了. 1 问题描述 给定一个链表,请将其逆序.即如果链表 ...

  8. C语言的单链表逆序和指定范围逆序

    文章目录 前言 逆序 指定范围逆序 源码实现 前言 关于链表的逆置,是考察对链表指针的理解.知道了如何不实用额外空间,同时使用O(n)复杂度对链表进行逆序之后将会对链表有好理解. 同时关于如何在指定范 ...

  9. 单链表逆序生成及逆置的完整实现

    单链表逆序生成及逆置的完整实现 本例中单链表数据类型定义成int型,可更改 头文件1(1.h) 宏定义及Status类型定义 头文件2(2.h) 单链表基本操作函数与逆置函数 include" ...

最新文章

  1. python logging模块的作用_Python 日志模块logging分析及使用-2
  2. 计算机网络实验(思科模拟器Cisco Packet Tracer)——交换机配置以及虚拟局域网VLAN
  3. JMX的Hello World
  4. 我为什么“放弃”从事八年的嵌入式领域
  5. 初识函数式编程(Functional Programming,FP)
  6. MS SQL Server 2000 游标的使用方法
  7. c语言:新颖的进制灵活应用
  8. paip.svn服务服务器安装配置
  9. frida-trace入门
  10. 邮箱服务器如何配置?POP和IMAP如何定义?
  11. 再见,可视化!你好,Pandas!
  12. centos7 AMOEBA读写分离配置
  13. pdf转换成jpg python_Python Wand将PDF转换为JPG background
  14. 万国觉醒服务器维护,《万国觉醒》怎么换服 更换服务器方法攻略
  15. 数据化运营17 留存:如何通过数据、社交、内容手段提升用户留存?
  16. SQLmap-tamper详细介绍
  17. 能转16进制的计算机软件,16进制计算器能否完成各种不同进制的转换?
  18. Linux系统高树攀登之路
  19. 蓝旭前端第二周预习———HTML标签+如何查看控制台
  20. LINGO实例,优化问题1

热门文章

  1. HBase MapReduce
  2. iPhone UITableViewCell如何滚动到视图顶端。
  3. [2013-08-19] nohup的使用
  4. ellen 纽奥良大学演讲
  5. aix java home_java程序员工作日子一(java_home 配置)
  6. java批量提取文件夹名称_bat 批量提取指定目录下的文件名
  7. mysql有实例名这个概念,MySQL的一些概念笔记
  8. 链式存储mysql_链栈:栈的链式存储结构
  9. mysql教程目录_MySql目录(二)
  10. java.util.scanner sc_关于Java的Scanner的问题,菜鸟求各大神解答