本文章记录了实现链表的逆向打印的方法。首先一个比较简单的实现方法是,将链表的所有指针全部反向,这种方法是不值得推荐的,因为打印操作一般是一个只读的过程,很少可以修改要打印的内容。所以在这里我们记录一下比较好的一些实现方法。
首先我们可以考虑,反向输出链表的过程实际上是一个先入后出的过程,从头到尾遍历链表,先读到的内容是后打印的。这就让我们想到了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的实现方法则不会出现这种问题。