首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中以正确的顺序打印链表

在C语言中,要以正确的顺序打印链表,可以使用递归或迭代的方式来实现。以下是两种常见的方法:

方法一:递归法 递归法是一种简洁的方法,可以通过递归函数来实现链表的逆序打印。

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct ListNode {
    int val;
    struct ListNode* next;
};

// 递归函数
void printListReverse(struct ListNode* head) {
    if (head == NULL) {
        return;
    }
    printListReverse(head->next);
    printf("%d ", head->val);
}

// 测试样例
int main() {
    // 创建链表
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->val = 1;
    head->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next->val = 2;
    head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next->next->val = 3;
    head->next->next->next = NULL;

    // 逆序打印链表
    printListReverse(head);

    // 释放链表内存
    free(head->next->next);
    free(head->next);
    free(head);

    return 0;
}

方法二:迭代法 迭代法是通过辅助栈来实现链表的逆序打印。

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct ListNode {
    int val;
    struct ListNode* next;
};

// 迭代函数
void printListReverse(struct ListNode* head) {
    struct ListNode* stack[1000];  // 定义辅助栈
    int top = -1;

    // 将链表节点依次入栈
    while (head != NULL) {
        stack[++top] = head;
        head = head->next;
    }

    // 出栈并打印节点值
    while (top >= 0) {
        printf("%d ", stack[top--]->val);
    }
}

// 测试样例
int main() {
    // 创建链表
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->val = 1;
    head->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next->val = 2;
    head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next->next->val = 3;
    head->next->next->next = NULL;

    // 逆序打印链表
    printListReverse(head);

    // 释放链表内存
    free(head->next->next);
    free(head->next);
    free(head);

    return 0;
}

以上是两种在C语言中以正确的顺序打印链表的方法。这些方法可以应用于各种链表相关的问题,例如链表的反转、链表的合并等。如果你想了解更多关于链表的知识,可以参考腾讯云的云原生数据库TDSQL产品,它提供了高性能、高可用的分布式数据库服务,适用于各种场景的数据存储需求。详情请访问:腾讯云TDSQL产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

链表实现栈动态顺序存储实现—C语言

ElemType y); void visit(ElemType e); #endif /* ELEMTYPE_H */  DynaSeqStack.h /*** *DynaSeqStack.h - 动态顺序定义...(x-y); } void visit(ElemType e) { printf("%dn", e); } DynaSeqStack.cpp /*** *DynaSeqStack.cpp - 动态顺序栈...,即栈动态顺序存储实现 * * *题目:实验3-1 栈动态顺序存储实现 * * * * ****/ #include #include #include...------- 操作目的: 初始化栈 初始条件: 无 操作结果: 构造一个空栈 函数参数: SqStack *S 待初始化栈 返回值: bool 操作是否成功 --------------...初始条件: 栈S已存在 操作结果: 返回S数据元素个数 函数参数: SqStack S 栈S 返回值: int 数据元素个数 ----------------------------

98220

ProtobufCmake正确使用

这也是噩梦开始,mediapipe.proto文件很多,核心framework目录下存在很多.proto文件,根目录和子目录都有.proto文件: 而且每个proto文件之间存在引用顺序,...,这里import类似于C++include,但是这里import又可以相互引用,例如上述status_handler.proto也引用了mediapipe_options.proto。...另外,不同目录内.cc文件会引用相应目录生成.pb.h文件,我们需要生成.pb.cc和.pb.h原始目录,这样才可以正常引用,要不然需要修改其他源代码include地址,比较麻烦。...CLionCmake来编译proto生成.pb.cc和.pb.h不在原始目录,而是集中cmake-build-debug(release),我们额外需要将其中生成.pb.cc和.pb.h文件移动到原始地址...正确修改cmake 对于这种情况,比较合适做法是直接使用命令进行生成。

89820

链表----链表添加元素详解--使用链表虚拟头结点

在上一小节关于链表中头部添加元素与在其他位置添加元素逻辑上有所差别,这是由于我们在给链表添加元素时需要找到待添加元素位置前一个元素所在位置,但对于链表头来说,没有前置节点,因此逻辑上就特殊一些...size = 0; } (3)改进之前add(int index,E e)方法,之前对头结点添加元素单独做了处理(if-else判断),如下: 1 //链表index(0--based...//链表index(0--based)位置添加新元素e (实际不常用,练习用) public void add(int index, E e) { if (index...LinkedList() { 43 dummyHead = new Node(null, null); 44 size = 0; 45 } 46 47 //获取链表元素个数...isEmpty() { 54 return size == 0; 55 } 56 57 //链表index(0--based)位置添加新元素e (实际不常用

1.8K20

JavaScript数据结构(链表

通过这种方式,链表节点可以按顺序链接在一起,形成一个链式结构。与数组不同,链表节点在内存可以不连续存储,每个节点都可以独立分配内存,并通过指针连接到下一个节点,从而实现灵活插入、删除操作。...然而,大多数语言中这种数据结构有一个缺点:数组大小是固定,从数组起点或中间插入或移除项成本很高,因为需要移动元素。链表存储有序元素集合,但不同于数组,链表元素在内存并不是连续放置。...然而,链表缺点是访问链表特定元素时间复杂度较高,需要从头开始遍历链表直到找到目标节点。---详细看一下列表JavaScript,可以使用对象来实现链表。...this.print = function(){}; //打印链表元素} 向链表尾部追加元素向对象尾部添加一个元素时,可能有两种场景:列表为空,添加是第一个元素,或者列表不为空,向其追加元素。...remove(element):从列表移除一项。indexOf(element):返回元素列表索引。如果列表没有该元素则返回-1。

31920

JavaScript数据结构(链表

通过这种方式,链表节点可以按顺序链接在一起,形成一个链式结构。 与数组不同,链表节点在内存可以不连续存储,每个节点都可以独立分配内存,并通过指针连接到下一个节点,从而实现灵活插入、删除操作。...---- 详细看一下列表 JavaScript,可以使用对象来实现链表。每个节点被表示为一个包含数据和指针属性对象,通过这些对象之间引用来构建链表结构。...把LinkedList对象转换成一个字符串 this.print = function(){}; //打印链表元素 } 向链表尾部追加元素 向对象尾部添加一个元素时,可能有两种场景:列表为空,添加是第一个元素...这样,可以需要时候方便地进行双向遍历。 在这里插入图片描述 ---- 循环链表 循环链表可以像链表一样只有单向引用,也可以像双向链表一样有双向引用。...insert(position, element):向列表特定位置插入一个新项。 remove(element):从列表移除一项。 indexOf(element):返回元素列表索引。

14510

PHPstrpos函数正确使用方式

首先简单介绍下 strpos 函数,strpos 函数是查找某个字符字符串位置,这里需要明确这个函数作用,这个函数得到是位置。 如果存在,返回数字,否则返回是 false。...echo '不存在'; } 输出了’不存在’;原因是因为 ‘沈’ ‘沈唁志博客’第 0 个位置;而 0 if 中表示了 false,所以,如果用 strpos 来判断字符串是否存在某个字符时...必须使用===false 必须使用===false 必须使用===false 重要事情说三遍,正确使用方式如下 // 判断‘沈唁志博客’是否存在‘博客’这个词 if (strpos('沈唁志博客...,是时候为智商讨个说法了,事实上输出是’不存在’,细心童鞋会发现这个 1 是不带引号,strpos 第二个参数必须是字符串型,因此,如果你是循环或者其他情况下调用 strpos 函数,而且不确定第二个参数类型...原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:PHPstrpos函数正确使用方式

5.1K30

【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序链表C++和Python实现)

剑指Offer(三):从尾到头打印链表 输入一个链表头节点,从尾到头反过来返回每个节点值(用数组返回)。...示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 1、思路 通常,这种情况下,我们不希望修改原链表结构。返回一个反序链表,这就是经典“后进先出”,我们可以使用栈实现这种顺序。...遍历列表时,将当前节点 next 指针改为指向前一个元素. 2、代码 C++: /** * Definition for singly-linked list.... Python ,很容易构造一个列表反向副本,也很容易比较两个列表。因此最好使用双指针法来检查是否为回文。...在编码过程,注意我们比较是节点值大小,而不是节点本身。正确比较方式是:node_1.val == node_2.val。而 node_1 == node_2 是错误

82310

剑指Offer学习笔记(C#篇)-- 从尾到头打印链表

题目描述 输入一个链表,按链表值从尾到头顺序返回一个ArrayList。 一 . 个人想法 这个题目搞了一段时间,因为解法好多,比如:是用递归法呢还是循环呢,要不要使用栈呢等等.....解题方法 方法一:栈+循环 具体思路:输入一个链表1(特点:先进先出) → 建一个栈(特点:先前后出)和一个链表2 → 把链表数据高进栈 → 把栈里东西倒进链表2 →...//首先输入一个名为printListFromTailToHead链表;List为链表类型;ListNode listNode分别为指针和数据 public List stack = new Stack(); //定义一个名为list链表,即为最后输出那个表 List list...list.Add(item); } return list; } } 方法二:链表+循环 具体思路:使用两个链表,第一个正序输入,第二个倒着输入

44120

日志记录Java异常信息正确姿势

遇到问题 今天遇到一个线上BUG,执行表单提交时失败,但是从程序日志中看不到任何异常信息。...原因分析 先来看一下Java异常类图: ? Throwable是Java中所有异常信息顶级父类,其中成员变量detailMessage就是调用e.getMessage()返回值。...enableSuppression) suppressedExceptions = null; } 显然,从源码可以看到Throwable默认构造函数是不会给detailMessage...所以,程序日志不要单纯使用getMessage()方法获取异常信息(返回值为空时,不利于问题排查)。...正确做法 Java开发,常用日志框架及组件通常是:slf4j,log4j和logback,他们关系可以描述为:slf4j提供了统一日志API,将具体日志实现交给log4j与logback。

2.5K40

数据结构:链表 Apache Kafka 应用

这一讲,我想和你分享一下,数组和链表结合起来数据结构是如何被大量应用在操作系统、计算机网络,甚至是 Apache 开源项目中。...像我们写程序时使用到 Java Timer 类,或者是 Linux 制定定时任务时所使用 cron 命令,亦或是 BSD TCP 网络协议检测网络数据包是否需要重新发送算法里,其实都使用了定时器这个概念...从前面的学习我们可以知道,在数组插入一个新元素所需要时间复杂度是 O(N),而在链表结尾插入一个新节点所需要时间复杂度是 O(1),所以在这里可以选择用链表来维护定时器列表。...我们可以还是继续维护一个定时器列表,与第一种方法不一样是,每次插入一个新定时器时,并不是将它插入到链表结尾,而是从头遍历一遍链表,将定时器超时时间按从小到大顺序插入到定时器列表。...) % 8T = 3 我们算出了等待周期和新插入数组索引位置之后,就可以更新溢出列表,如下图所示: “时间轮”算法,定时器检测进程只需要判断“时间轮”数组现在所指向索引里链表为不为空,如果为空则不执行任何操作

96870

内网穿透神器:Ngrok支付正确使用姿势

前言 随着互联网发展,无论是web服务还是移动APP越来越多都集成了第三方支付(支付宝、微信、银联)。...然而在实际开发测试环境,我们一般都是在内网开发,所以说对于支付测试是一件比较麻烦事情。...Ngrok ngrok 是一个反向代理,通过公共端点和本地运行 Web 服务器之间建立一个安全通道。ngrok 可捕获和分析所有通道上流量,便于后期分析和重放(百度百科)。...1.7+以后不再开源,收费才是持续发展动力 国内也有相应ngrok服务 natapp、frp、nat123端口映射、内网通、花生壳等等,这里就不一个个介绍了,有兴趣可以自行谷歌,毕竟今天主角是Ngrok...客户端和服务端生成/data/ngrok/bin目录下: bin/ngrokd 服务端 bin/ngrok linux客户端 bin

2.3K30

DateTimeExtJs无法正确序列化问题

这几天在学习ExtJs + Wcf过程,发现一个问题,如果Class中有成员类型为DateTime,即使我们正常标识了[DataMember],序列化成JSON时,会生成一种特有的格式: .....这种格式ExtJs并不识别,导致最终组件,比如Grid上无法正常显示,解决办法有二个: 1.将Class成员,手动改成String类型,不过个人不推荐这种方式,毕竟将数据类型都改了,相应服务端很多地方都可能会做相关修改...2.用JS在前台调用时,用代码处理返回JSON字符串格式,使之符合ExtJs规范(这个方法是从博客园"小庄"那里学来,呵) Ext.onReady(function() { //这个函数演示了怎样把服务器端...DateTime类型转为Javascript日期         function setAddTime(value, p, record) {             var jsondate...设置GridColumns时,类似如下处理: var grid = new Ext.grid.GridPanel({             store: store,

2.6K100

内网穿透神器:Ngrok支付正确使用姿势

前言 随着互联网发展,无论是web服务还是移动APP越来越多都集成了第三方支付(支付宝、微信、银联)。...然而在实际开发测试环境,我们一般都是在内网开发,所以说对于支付测试是一件比较麻烦事情。...Ngrok ngrok 是一个反向代理,通过公共端点和本地运行 Web 服务器之间建立一个安全通道。ngrok 可捕获和分析所有通道上流量,便于后期分析和重放(百度百科)。...1.7+以后不再开源,收费才是持续发展动力 国内也有相应ngrok服务 natapp、frp、nat123端口映射、内网通、花生壳等等,这里就不一个个介绍了,有兴趣可以自行谷歌,毕竟今天主角是Ngrok...客户端和服务端生成/data/ngrok/bin目录下: bin/ngrokd 服务端 bin/ngrok linux客户端 bin

2.3K30

轻量化设计3D打印应用

其中,采用3D 打印方法进行产品设计所包含关键技术主要有:1、选用何种打印材料,采用何种打印机(打印原理),如何能够降低成本?2、如何进行产品结构设计,得到所需要三维模型?...No.1 常用打印材料 3D打印领域中,主要应用到材料包括工程塑料、光敏树脂及类橡胶材料,现对他们进行归纳总结,具体如下表所示: 名称 工艺 特点 PLA FDM 表面有颗粒感、成本低、多小型打印机...众所周知,3D打印机在打印金属、软胶等特殊材料过程具有较高成本,成为限制该技术向消费者广泛推广重要因素。...于此同时,3D打印打印重量有直接关系,因此,设计阶段采用轻量化结构设计,指导产品结构选型,相关参数选取,进而降低打印质量,提高打印性价比,对该技术推广具有重要意义。...例如:需要设计一款台灯支架,具体要求为:1、能够作为具有一定刚度;2、台灯发光过程具有部分热量辐射到支架上,使之温度升高(具有一定耐温性);3、尽可能实惠。

1.1K20

Gradle依赖方式——LombokGradle正确配置姿势

很多人在项目依赖中直接这样写 compile "org.projectlombok:lombok:1.18.4" 但这样处理Gradle 5.0以上被命令禁止了,4.x高级版本编译时也会有对应告警...例如A依赖B,B依赖C,那么A里面将不能调用C方法; compile only:编译有效,打包无效。...并且在打jar/war包时候,并不需要把lombok依赖打进包,所以Lombok依赖上应该是compile only(仅在编译时生效)才对。...Lombok正确配置 回到开头官方告警,有这么一句 Detecting annotation processors on the compile classpath is deprecated and...5.0环境下,注解处理将不再compile classpath,需要手动添加到annotation processor path。

10.9K41
领券