C++实现单向链表的逆向打印

本文介绍了两种链表逆向打印的有效方法:使用栈存储节点和递归算法。栈法利用先进后出特性,递归法则先输出后继节点再输出当前节点,避免修改链表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章记录了实现链表的逆向打印的方法。首先一个比较简单的实现方法是,将链表的所有指针全部反向,这种方法是不值得推荐的,因为打印操作一般是一个只读的过程,很少可以修改要打印的内容。所以在这里我们记录一下比较好的一些实现方法。

首先我们可以考虑,反向输出链表的过程实际上是一个先入后出的过程,从头到尾遍历链表,先读到的内容是后打印的。这就让我们想到了stack这一数据结构,我们可以在每读取到一个节点时,将该节点放到栈中,遍历完成整个链表之后,从栈顶逐个输出节点的值,就直接实现了逆向输出的过程。代码如下:

void PrintListReversingly(ListNode* pHead)
{
	stack<ListNode*> nodes;
	ListNode* pNode = pHead;
	// 使用stack存储实现先进后出
	while (pNode != nullptr)
	{
		nodes.push(pNode);
		pNode = pNode->next;
	}
	while (!nodes.empty())
	{
		pNode = nodes.top();
		cout << pNode->key << endl;
		nodes.pop();
	}
}

除了使用栈实现之外,我们可以考虑使用递归进行实现。在访问一个节点的时候,我们先递归输出它后边的节点,然后再输出本身节点内容,这样就实现了逆向输出,代码如下:

void PrintListReversinglyRecursively(ListNode* pHead)
{
	if (pHead != nullptr)
	{
		if (pHead->next != nullptr)
		{
			PrintListReversinglyRecursively(pHead->next);
		}
		cout << pHead->key << endl;
	}
}

在这两种方法中,递归调用的缺陷在于,如果链表非常长,导致函数的调用层次很深,进而导致函数调用的栈溢出,而使用stack的实现方法则不会出现这种问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值