面试题6:从尾到头打印链表
1 题目:
输入一个链表的头结点,从尾到头打印每个节点的值。链表定义如下:
struct ListNode
{
int m_nkey;
ListNode* m_pNext;
}
2 思路
由于遍历的顺序是从头到尾,而输出的顺序是从尾到头,典型的后进先出,可以利用栈实现这种顺序。每经过一个节点,将其存入栈中,当遍历完链表后,再从栈顶顺序输出节点的值。
3 代码示例
void printListReversingly_Iteratively(ListNode* pHead)
{
std::stack<ListNode*> nodes;
ListNode *pNode = pHead;
while(pNode!=nullptr)
{
nodes.push(pNode);
pNode = pNode->m_pNext
}
while(!nodes.isempty())
{
pNode = nodes.top();
printf("%d\t",pNode->m_nkey);
nodes.pop();
}
}
由于递归本质上也是一种栈结构,也可以使用递归的方式输出链表,每访问到一个节点的时候,先递归输出后面的节点,再输出自身节点,这样链表输出结果就返过来了。
void PringListReversingly_recursively(ListNode* pHead)
{
if(pHead!=nullptr)
{
if(pHead->m_pNext!=nullptr)
{
PringListReversingly_recursively(pHead->m_pNext);
}
printf("%d\t",pNode->m_nkey);
}
}
可能存在的问题:当链表非常场的时候,就会导致函数调用的层级很深,从而很有可能导致函数调用栈溢出。

浙公网安备 33010602011771号