题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
题目分析
使用栈:先遍历一遍链表,每经过一个节点,把该节点的数据放入栈中。遍历结束后,从栈顶开始输出元素值。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
ListNode* p = head;
stack <int> stk;
while(p){
stk.push(p->val);
p = p->next;
}
vector<int> v;
//cout<< stk.size()<< endl;
while(!stk.empty()){
v.push_back(stk.top());
stk.pop();
}
return v;
}
};
递归:每访问一个节点,先递归输出它后面的结点,再输出该节点自身。
void PrintListReversingly_Recursively(ListNode* pHead){
if(pHead != nullptr){
PrintListReversingly_Recursively(pHead->m_pNext);
}
printf("%d\t",pHead->m_nValue);
}
递归方法看起来代码简洁,但是当链表非常长的时候,就会导致函数调用的层级很深,可能导致函数调用栈溢出。
用栈基于循环的方法的代码鲁棒性更强。