题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
1 2
| 输入:head = [1,3,2] 输出:[2,3,1]
|
限制:
$0 <= 链表长度 <= 10000$
算法 1
(迭代) $O(n)$
从前往后遍历链表,存储每个节点的值到答案数组中,然后反转答案数组就是从尾到头打印链表的结果。
时间复杂度
$O(n)$
空间复杂度
$O(n)$
C++ 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Solution { public: vector<int> reversePrint(ListNode* head) { vector<int> res; for (auto p = head; p; p = p->next) res.push_back(p->val); reverse(res.begin(), res.end()); return res; } };
|
算法 2
(递归) $O(n)$
递归的出口条件:当前节点为空,返回空数组
递归逻辑:先递归到最后一个节点,然后从最后一个节点开始将节点值存储到答案数组中,递归函数不断弹栈,最后答案数组中存储的就是从尾到头打印链表的结果。
时间复杂度
$O(n)$
空间复杂度
存储答案的空间 $O(n)$,包含递归系统栈所需的空间 $O(n)$。
C++ 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
class Solution { public: vector<int> res;
vector<int> reversePrint(ListNode* head) { if (!head) return {}; reversePrint(head->next); res.push_back(head->val); return res; } };
|