文章标题 C语言实现单链表之逆置和逆序打印

一、逆序打印(只遍历一次)
如果没有要求只遍历一次,那么就可以用循环就可以解决,但其难点在于遍历一次,要解决此问题就必须用到递归
代码实现:
void PrintListTailToHead(pSeqList pHead)
{
if (pHead == NULL)
{
return;
}
PrintListTailToHead(pHead->pNext);
printf(“%d “, pHead->_data);
}
注意:递归条件的设置(条件不对,递归不会停止,程序会因为内存耗尽而崩溃)

二、逆置(只遍历一次)
与上面逆序打印不同的是逆置需要改变节点的指向,因此可以把第一节点当一个新的链表,把后面的节点头插即可完成要求
代码实现:
void ReverseList(pSeqList* pHead)
{
assert(pHead);
pSeqList proNode = *pHead;
pSeqList NextNode = proNode;
pSeqList NowNode = NULL;
if ((*pHead == NULL) || (proNode->pNext == NULL))
{
return;
}
//第一个节点为新的链表,所以需要从第二个节点开始
proNode = proNode->pNext;
while (proNode != NULL)
{
NowNode = proNode;//保存当前节点
proNode = proNode->pNext;//走到后一个节点
//头插
NowNode->pNext = NextNode;
NextNode = NowNode;
}
//当头插时原链表的第一个节点为新链表的最后一个节点,因此要制空
(*pHead)->pNext = NULL;
*pHead = NowNode;
}
注意:当链表为空和只有一个节点时逆置是没有意义的,出循环时把新链表的最后一个节点制NULL,否则会形成环。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值