从尾到头打印单向链表
题目
输入一个链表的头节点,从头到尾反过来打印出每个节点的值。
链表节点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;`
};
就开始的想法可能是将指针进行反向,这样就可以从尾向前打印了,但是需要询问面试官是否能修改输入的数据。
一般而言,对于只读操作,不希望打印是改变修改的内容。
因此我们讨论不改变输入的情况
再仔细想一想,前面读入的后面打印,听起来十分熟悉对不对。没错——“后进先出”,十分典型的栈结构。因此:
每当遍历到一个节点时,将它放入栈中,
遍历完后依次打印栈中节点的值
完成
利用栈的实现方法:
void PrintListReversingly_Iterativaly(ListNode* pHead)
{
std::stack<ListNode*> nodes;
ListNode* pNode=pHead;
while(pHead!=nullptr)
{
nodes.push(pNode);
pNode=pNode->m_pNext;
}
while(!nodes.empty())
{
pNode=nodes.top();
std::out<<pNode->m_nVaule<<std::endl;
nodes.pop();
}
}
想到了栈,便会想到递归,因此递归本质上是栈实现的,因此可以先递归打印后面的节点,再打印本身。但是递归有个问题,链表长度非常长时,会导致函数调用层级很深,从而导致函数调用栈溢出
利用递归的实现方法:
void PrintListReversingly_Iterativaly(ListNode* pHead)
{
if(pHead != nullptr)
{
if(pHead->m_pNext!=nullptr)
{
PrintListReversingly_Iterativaly(pHead->m_pNext);
}
std::cout<<pHead->m_nValue<<std::endl;
}
}
所以用栈还是用递归实现,需要我们具体问题具体分析
————————————————————————————————————————————————————
参考书籍: 《剑指offer 第二版》