从尾到头打印链表:最直观的想法是,创建一个新的vector<int>变量result,然后使用一个链表节点指针p指向当前访问的链表节点,p初始化为头节点head,当p不为null时,将p所指向的节点元素值加入到result头部,然后使p指向p的下一个节点,最后返回result。

vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> result;
        ListNode *p=head;
        while(p!=NULL)
        {
            result.insert(result.begin(),p->val);
            p=p->next;
        }
        return result;
    }

idea:从尾到头打印链表,其实相当于逆序输出或者是反转输出,利用该性质,我们可以很自然的想到递归解法。

void dfs(vector<int> &result,ListNode *p)
    {
        if(p==nullptr) return;
        dfs(result,p->next);
        result.push_back(p->val);
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> result;
        ListNode *p=head;
        dfs(result,p);
        return result;
    }

优化:递归本身系统内部会调用栈,那么不妨直接使用栈结构实现,正如同从头到尾访问链表,但是从尾到头打印链表,即先访问的后打印,满足栈先进后出的特点。

vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> result;
        ListNode *p=head;
        stack<int> st;
        while(p)
        {
            st.push(p->val);
            p=p->next;
        }
        while(st.size())
        {
            result.push_back(st.top());
            st.pop();
        }
        return result;
    }