剑指 Offer 06. 从尾到头打印链表
程序员文章站
2022-06-17 17:27:19
...
题目描述
思路分析
暴力方法需要好几次的逆置,我们可以使用递归或者辅助栈实现。利用了栈的后进先出的性质,递归的回溯的性质。
代码展示
辅助栈法
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack<int> nums;
while (head) {
nums.push(head->val);
head = head->next;
}
vector<int> ret;
while (!nums.empty()) {
ret.push_back(nums.top());
nums.pop();
}
return ret;
}
};
递归代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> nums;
_help(head, nums);
return nums;
}
void _help(ListNode* head, vector<int> &nums) {
if (head == NULL) {
return ;
}
_help(head->next, nums);
nums.push_back(head->val);
}
};
结果分析
栈时间复杂度 O(N): 入栈和出栈共使用 O(N)时间。
空间复杂度 O(N): 辅助栈 stack 和数组 ret 共使用 O(N)的额外空间。
递归时间复杂度 O(N): 遍历链表,递归 N 次。
空间复杂度 O(N): 系统递归需要使用O(N) 的栈空间。
上一篇: 四款近期热度最高降噪真无线耳机横评 国产品牌的逆袭
下一篇: 耳塞都是一次性的吗 耳塞可以用多久不换