c++三种解法

顺序输入再反转

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ans;
        while(head){
            ans.push_back(head->val);
            head=head->next;
        }
        //可以直接使用库函数reverse()
        int tmp=0;
        for(int i=0;i<ans.size()/2;i++){
            tmp=ans[i];
            ans[i]=ans[ans.size()-1-i];
            ans[ans.size()-1-i]=tmp;
        }
        return ans;
    }
};

利用递归实现栈的效果来反转

class Solution {
public:

    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ans;
        if(!head) return ans;
        ans=printListFromTailToHead(head->next);
        ans.push_back(head->val);
        return ans;
    }
};

先判断终止条件,然后处理当前节点:将本节点结果放在上一个节点结果的后面。

反转链表再输出

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        ListNode* pre=NULL;
        ListNode* cur=head;
        ListNode* tmp;
        while(cur){
            tmp=cur->next;
            cur->next=pre;
            pre=cur;
            cur=tmp;
        }
        vector<int> ans;
        while(pre){
            ans.push_back(pre->val);
            pre=pre->next;
        }
        return ans;
    }
};

反转链表需要三个节点:前一个,当前的,以及用来保护现场的临时节点。