1.问题描述
输入一个链表的头结点,按链表值从尾到头的顺序返回一个ArrayList。
2. 解决思路
由于是反向打印,所以是一个“后进先出”的问题,使用栈来解决,虽然递归的本质就是一个栈结构,但是当链表非常长的时候,函数调用的层级很深,可能会导致函数调用栈溢出,鲁棒性不够好。
3. 代码实现
1)基于栈的代码实现如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vec;
stack<int> stack;
ListNode* node = head;
//利用栈的后进先出
if(head != NULL){
stack.push(head->val);
while(node->next != NULL){
node = node->next;
stack.push(node->val);
}
while(!stack.empty()){
vec.push_back(stack.top());
stack.pop();
}
}
return vec;
}
};
2)基于递归的实现代码:会超时
class Solution {
public:
vector<int> vec;
vector<int> printListFromTailToHead(ListNode* head) {
ListNode *node = head;
if(node != NULL){
while(node->next != NULL){
printListFromTailToHead(node->next);
}
vec.push_back(node->val);
}
return vec;
}
};