描述

输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。

如输入{1,2,3}的链表如下图:

103D87B58E565E87DEFA9DD0B822C55F

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例1

输入:

{1,2,3}

返回值:

[3,2,1]

算法思路1

主要考察翻转数组的操作,把链表的数据放到数组里,然后在数组里操作,一个比较简单的操作是调用C++的库函数

class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vt;
ListNode* p = head;
while(p != nullptr){
vt.push_back(p->val);
p = p->next;
}
reverse(vt.begin(),vt.end());
return vt;
}
};

算法思路2

使用递归的方式解决,递归出口是链表循环到末尾,每次递归做的事就是把当前结点的值放到vector容器中,由于递归到末尾才会开始存放结点(res.push_back(head->val);)的值,时间顺序正好为从后往前的存放,符合题目要求的逆序

/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:

void reverse(ListNode* head,vector<int> &res){
if(head != nullptr){
reverse(head->next,res);
res.push_back(head->val);
}
}

vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
reverse(head,res);
return res;
}
};