剑指offer:链表逆序输出

//第一反应想到的

利用栈的特性:

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> value;
        ListNode *p=NULL;
        p=head;
        stack<int> stk;
        while(p!=NULL){
            stk.push(p->val);
            p=p->next;
        }
        while(!stk.empty()){
            value.push_back(stk.top());
            stk.pop();
        }
        return value;
    }
};

递归写法:  //第二种想到的。。

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

这个没有考虑..感觉操作次数偏多,影响效率.看到别人的题解学习一下思路

第三种:数组翻转

链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?f=discussion
来源:牛客网

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> value;
        ListNode *p=NULL;
        p=head;
        while(p!=NULL){
            value.push_back(p->val);
            p=p->next;
        }
        //reverse(value.begin(),value.end()); //C++自带的翻转函数
        int temp=0;
        int i=0,j=value.size()-1;
        while(i<j){
            temp=value[i];    //也可以用swap函数,swap(value[i],value[j]);
            value[i]=value[j];
            value[j]=temp;
            i++;
            j--;
        }
        return value;
    }
};
原文地址:https://www.cnblogs.com/BillowJ/p/12669664.html