题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
方法一:从头到尾遍历,最后做逆序操作
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if(head == NULL)
return res;
else
{
ListNode* p = head;
while(p != NULL)
{
res.push_back(p->val);//res.insert(res.begin(),p->val)头插
p = p->next;
}
reverse(res.begin(),res.end());
return res;
}
}
};
方法二:栈操作,后进先出
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
stack<int> stk;
if(head == NULL)
return res;
else
{
ListNode* p = head;
while(p != NULL)
{
stk.push(p->val);
p = p->next;
}
}
while(!stk.empty())
{
res.push_back(stk.top());
stk.pop();
}
return res;
}
};
方法三:递归,注意链表非常长时,会导致函数调用的层级很深,有可能导致函数调用栈溢出。
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
if(head != NULL)
{
res.insert(res.begin(),head->val);
if(head->next != NULL)
{
vector<int> tmp = printListFromTailToHead(head->next);
if(tmp.size()>0)
res.insert(res.begin(),tmp.begin(),tmp.end());
}
}
return res;
}
};