目录

  • 1 题目
  • 2 分析
    • 2.1 方法1-原地逆置
    • 2.2 方法2-递归
  • 3 实现
    • 3.1 实现1-原地逆置
    • 3.2 实现2-递归
  • 4 运行结果

1 题目

反向输出一个链表,链表结构为:

typedef int ElementType;
typedef struct node {ElementType data;struct node *Next;
} *List;

2 分析

2.1 方法1-原地逆置

原地逆置链表的思路是将原链表的头节点和其余节点分成两个部分,然后将其余节点逐个取下节点进行头插法插入到原链表的头结点前面,这样就实现了链表原地逆置,且空间复杂度为 O(1)O(1)O(1)。

List reverse(List L)
{List prep;List p;List q;p = L->Next;q = p->Next;p->Next = NULL;while (q) {prep = p;p = q;q= q->Next;p->Next = prep;}L->Next = p;return L;
}

2.2 方法2-递归

上面的一种情况是强制改变链表原有顺序,那么也可以不改变链表的顺序,只逆序输出,那么可以使用递归,采用栈的思想,当链表的下一节点不为空NULL时进行递归,当链表的下一节点为NULL时返回递归输出节点数据,如下:

void reverse_2(List L) {if (L->Next != NULL) {reverse_2(L->Next);}printf("%d ", L->data);
}

调用方法为:

 reverse_2(L->Next);

3 实现

3.1 实现1-原地逆置

#include <stdio.h>
#include <stdlib.h>
#include <time.h>typedef int ElementType;
typedef struct node {ElementType data;struct node *Next;
} *List;// 创建链表
List CreateList(void) {List L = (List)malloc(sizeof(struct node));L->data = 0;L->Next = NULL;return L;
}// 初始化链表节点数据
void InitList(List L) {srand((unsigned)time(NULL)); // 随机数种子for (int i = 0; i < 10; i++) {List p = (List)malloc(sizeof(struct node));p->data = rand() % 100; // 节点数据采用随机数,随机数范围为0~99p->Next = L->Next;L->Next = p;}
}// 打印链表
void PrtList(List L) {List p = L->Next;while (p) {printf("%d ", p->data);p = p->Next;}printf("\n");
}// 逆置链表
List reverse(List L)
{List prep;List p;List q;p = L->Next;q = p->Next;p->Next = NULL;while (q) {prep = p;p = q;q= q->Next;p->Next = prep;}L->Next = p;return L;
}int main(void) {List L = CreateList(); // 创建链表InitList(L); // 初始化链表数据printf("原链表为:");PrtList(L);reverse(L); // 逆置链表printf("逆置后为:");PrtList(L);return 0;
}

3.2 实现2-递归

2.2 方法2-递归中的程序段。

4 运行结果

原链表为:50 6 12 12 55 60 57 47 85 29
逆置后为:29 85 47 57 60 55 12 12 6 50

C语言经典例73-反向输出一个链表相关推荐

  1. C语言经典例74-连接两个链表

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 连接两个链表,如有链表A和链表B,将链表B按原顺序接在链表A后面,链表结构为: typedef int ElementType; typed ...

  2. “拨”出数位上的数字 - 多种思路实现反向输出一个四位数

    文章目录 前言 一.引例 -- 反向输出一个四位数 1. 题干描述 2. 思路简述 二.实现思路 -- 拨出数字 思路一:用取模运算分别拨出数位 代码        说明 思路二:循环取数 代码    ...

  3. 每日程序C语言44-反向输出一个链表(递归)

    题目: 反向输出一个链表-递归 程序分析 只需要反向输出即可,所以我们可以使用栈的特点,进行递归调用 递归过程如下: 主要代码 main.c typedef struct Node{int data; ...

  4. C语言经典例98-将字符转为大写字母并写入文件

    目录 1 题目 2 分析 3 实现 1 题目 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存. 输入的字符串以!结束. 2 分析 写入 ...

  5. C语言经典例19-完数

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. 因子:假如整 ...

  6. JSK-T1011 反向输出一个三位数【入门】

    反向输出一个三位数 小蒜蒜有一个三位数,她想让聪明的你反向输出这个三位数. 输入格式 一个三位数 n (100≤n≤999). 输出格式 反向输出 n,要保留前导 0. 输出时每行末尾的多余空格,不影 ...

  7. 信息学奥赛一本通 1031:反向输出一个三位数 | OpenJudge NOI 1.3 13

    [题目链接] ybt 1031:反向输出一个三位数 OpenJudge NOI 1.3 13:反向输出一个三位数 [题目考点] 1. 分离固定数位数字的各位上的数字 先举例说明: 对于三位数123,其 ...

  8. 信息学奥赛一本通(1031:反向输出一个三位数)

    1031:反向输出一个三位数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 66372     通过数: 40000 [题目描述] 将一个三位数反向输出,例如输入 ...

  9. 啊哈添柴挑战Java1016. 反向输出一个三位数

    啊哈添柴--挑战 1016. 反向输出一个三位数 import java.util.Scanner;/*** @author yinglongwu*/ //1016. 反向输出一个三位数 public ...

最新文章

  1. 每秒5百亿亿次!Meta祭出元宇宙巨兽,联手英伟达打造全球最强超算
  2. [ExtJS5学习笔记]第十一节 Extjs5MVVM模式下系统登录实例
  3. python单词意思-Python这个单词是什么含义??????????????
  4. shell实例第2讲:获取随机字符串
  5. 如何看你的信息有没有泄露
  6. C++阶段01笔记08【结构体(基本概念、定义与使用、数组、指针、嵌套、const使用)】
  7. Kafka使用Java客户端进行访问
  8. HTTPS原理和CA证书申请
  9. SAP License:CO常见问题
  10. 网络配置辅导:多路由器如何使用多条ADSL线路
  11. CreateaJointCurve.txt
  12. 惠普m202dw_惠普HP LaserJet Pro M202dw 驱动
  13. 软考初级程序员考试大纲
  14. MFC——SetTimer函数的用法
  15. 思科交换机IOS备份和升级
  16. outlook邮箱pc/mac客户端下载 含最新版
  17. org.elasticsearch.common.util.concurrent.EsRejectedExecutionException 查询超时异常处理记录---一定要用单例模式
  18. postman工具批量调用接口
  19. 关于bootstrap--表格(table的各种样式)
  20. 三角形问题 -软件测试

热门文章

  1. 《CCNP SWITCH 300-115学习指南》——导读
  2. 手势追踪,高通走完其VR一体机的最后一里路
  3. DzzOffice增加应用对扩展名文件的支持设置,将会在Beta中提供。
  4. lsnrctl 与 tnsnames.ora 的联系
  5. HTTP 协议详解--转
  6. border属性的CSS缩写顺序
  7. 登录账号,玩猜数字游戏
  8. Socket.IO 客户端 API IO
  9. 第01章 初识Mysql
  10. tensorflwo-gpu win10_64bit 的安装版本问题