【C语言学习】链表的反转打印

头部插入与尾部插入链表

一、 链表的创建

前面提到过,链表是由各个结点组成,而每个结点由数据和指针(存储地址)组成,下面上图供理解在这里插入图片描述
该链表的实现是基于尾部插入,创建一个结构体指针,随着结点的创建总是指向最后一个结点

int n = 0, i = 0, data = 0;
		scanf("%d", &n);
		struct a* list = NULL;//如何找到这个链表,用list指向第一个结点
		struct a* tail = NULL;//用tail指向链表的最后一个结点
		for (i = 0; i < n; i++)
		{
			scanf("%d", &data);
			struct a* after = (struct a*)malloc(sizeof(struct a));
			after->data = data;
			after->next = NULL;//每插入一个结点,把指针域赋为空指针;当为最后一个结点时,指针域为空指针
			if (list == NULL)//将第一个结点的地址赋给list
			{
				list = after;
				tail = after;
			}
			else//不为第一个结点时,在结点指针域后存入新结点地址
			{
				tail->next = after;//第一个结点的指针域放入下一个结点的地址
				tail = after;//再将tail指向当前最后一个结点
			}
		}

在前文提到过具体方法:https://editor.csdn.net/md/?articleId=114953286

二、反转链表的创建

输入
{67,0,24,58}
打印值
[58,24,0,67]

如题要求,将链表的数据反过来打印。
查阅了些资料,大概有几种方法:

①栈实现,每经过一个结点时,把该结点放入一个栈中。
②把链表中结点的指针反转过来,改变链表的方向。
③以原链表中第一结点进行头部插入。

第一种方法暂时未学到(太菜了),第二种方法敲了半天不知道怎么实现(太菜。。),第三种方法可以一试。
解释如图:

在这里插入图片描述
有一点,最初的结点就变成最后一个结点,它的指针域赋为空指针。
头部插入代码实现如下:

struct a* after = list;
		struct a* begin = list;
		while (after->next)
		{
			after = after->next;//创建指针向后遍历结点,再赋给头部插入的结点。
			struct a* before = (struct a*)malloc(sizeof(struct a));
			before->next = list;
			before->data = after->data;//老链表的值赋给新链表
			list = before;
		}
		struct a* print = list;
while (print)
		{
			printf("%d ", print->data);
			print = print->next;
		}

在这里插入图片描述
这是很不错的一道题,第一种方法不改变结点,第二种方法改变了结点的指针域,第三种方法彻底重建了链表,差劲了。。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值