单向链表逆序-C语言

1 篇文章 0 订阅
1 篇文章 0 订阅

一、逆序要求

        链表逆序要求改变节点指向,即最后一个节点为第一个数据,依次指向前一个节点。而不是简单的数据交换。链表可分为有头节点和无头节点,本次代码实现建立在有头链表基础上,无头链表也可适用,实际上是一个道理。

二、实现思路

        要实现逆序该链表肯定得有两个及以上数据啦,首先,我们将复杂问题简单化,假设该链表只有两个数据,那么我们只需要将第二个链表的next指向第一个数据节点,然后再将头指向第二个节点是不是就大功告成啦。

        两个节点的逆序我们学会了,那三个节点的链表呢,是不是在两个节点逆序的基础上将第三个节点指向新的第一个节点,然后再将头指针指向原第三个节点。这样子是不是也大功告成啦。那么第四个第五个即更多是不是也是这个道理,而对于上诉过程的实现你们想到用什么了吗?只需要一个循环即可。

三、代码分析

        在实现过程中,英文设计节点指向的改变,我们需要提前将节点后面的地址保存,以及链表头需要指向的第一个节点。

/*
 *链表逆序,返回链表头
 *@head:链表头
 *
 */
Node* reverse_list(Node* head) {
	if(NULL == head || NULL == head->next) return head;

	Node* current = head->next;//当前节点,第一个节点
	Node* pnext = current->next;//下一个节点
	Node* pre_next = NULL;//保存节点
	current->next = NULL;//断开

	while(pnext) {//两个有效节点时进入
		pre_next = pnext->next;//保存下一个节点
		pnext->next = current;//后节点指向第一个节点
		current = pnext;//更新第一个节点
		pnext = pre_next;
	}
	head->next = current;//连接
	return head;
}

        在上诉代码中,Node* current 为第一个有效数据节点,该节点变量永远为第一个节点。

        Node* pnext 为下一个节点,保存需要改变指向的节点,第一次逆序时为第二个节点,后续为第三个节点,依次下去。

        Node* pre_next 保存的是pnext的下一个节点地址,当pnext指向改变时后续节点将会找不到,因此需要一个节点进行保存。

        在逆序结束后原第一个数据节点变为最后一个,所有一开始先将 current 的 next 至空。

        当 pnext 存在时进行循环,不断将下一个节点的next指向最开始的节点,在 pnext 进行指向改变后该节点会成为新的第一个节点,因此需要将 current 重新接收 pnext 的地址,然后让 pnext 指向它原本的下一个位置继续循环,即pre_next。

        最后让链表头指向逆序后的第一个节点,返回该头节点地址即可。

最后祝大家学业有成,工作顺利,天天开心。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pamy1291

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值