题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
思路1:用递归自上(顶)而下(子问题)求解,注意边界条件
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head!=nullptr){
if(head->next!=nullptr)
printListFromTailToHead(head->next);
res.push_back(head->val);
}
return res;
}
private:
vector<int> res;
};
//也可以写成如下方式
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head==nullptr)
return {};
printListFromTailToHead(head->next);
res.push_back(head->val);
return res;
}
private:
vector<int> res;
};
思路2:用一个栈存储节点数据,再输出到数组
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head==nullptr)
return {};
ListNode* node = head;
while(node!=nullptr){
st.push(node->val);
node = node->next;
}
while(!st.empty()){
res.push_back(st.top());
st.pop();
}
return res;
}
private:
vector<int> res;
stack<int> st;
};
思路3:数组的逆置
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head==nullptr)
return {};
ListNode* node = head;
while(node!=nullptr){
res.push_back(node->val);
node = node->next;
}
res = vector<int>(res.rbegin(),res.rend());
return res;
}
private:
vector<int> res;
stack<int> st;
};