题目描述:输入一个链表的头节点,从尾到头打印每个节点的值。
链表节点定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_Next;
}
看到题目后,我们的第一 反应就是要去遍历链表,然后呢?然后就没有然后了,因为题目是要求我们从尾到头打印。但题目给我们的链表结构是单链表,只能从一头往一头前进,也就是后遍历的先打印, 先遍历的后打印,是典型的后进先出”,于是我们想到了找 。我们可以将遍历到的节点压如栈, 再往下走,直到遍历完链表。实现将表节点全压入栈中。
此时节点的顺序已经反过来了,只需将节点依次出栈即可。
用栈来实现的代如下:
void printReversingly_Iteratively(ListNode* phead)
{
std::stack<ListNode* > nodes;
ListNode* pNode = phead;
while (pNode != nullptr)
{
nodes.push(pNode);
pNode = pNode->m_pNext;
}
while (!nodes.empty())
{
pNode = nodes.top();
printf("%d ", pNode->m_nValue);
nodes.pop();
}
}
其次我们还可以用递归来实现我们要打印一个节点,先递归打印它后面的节点,在输出该节点。
void printReversingly_Iteratively(ListNode* phead)
{
if(phead!=nullptr)
{
if(phead->m_pNext!=nullptr)
{
printReversingly_Iteratively(phead->m_pNext);
}
prinef("%d",phead->m_Value);
}
}
基于递归的代码看起来很简洁,但当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。