面试题6:从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来打印出每个结点的值。链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode *m_pNext;
};
解答:从题目可知,第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“先进后出”,可以用栈来实现这种顺序。代码如下:
vector<int> printListFromTailToHead(ListNode* head)
{
vector<int> result;
stack<int> sta;
if(NULL == head)
{
return result;
}
ListNode *p = head;
while(p != NULL)
{
sta.push(p->val);
p = p->next;
}
while(!sta.empty())
{
result.push_back(sta.top());
sta.pop();
}
return result;
}
既然想到了用栈来实现,而递归在本质上就是栈结构,于是又想到用递归实现。要实现反过来输出链表,每次访问到一个结点的时候,先递归输出它后面的结点,再输出结点自身。在这里就不实现了。不过有一个问题是当链表非常长的时候,就会导致函数调用的层数很深,从而有可能导致函数调用堆栈溢出。显然用栈基于循环实现的代码的鲁棒性要好一些。