利用数组和栈实现链表的反向输出
第三天打卡,话不多说,让我们开始:
题目:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
给出的代码片段:
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
}
};
实现思路:
看到反向输出,我的第一反应就是利用栈来实现,仔细想想,确实是可以实现的,栈的特点是后进先出,那么最后压入栈的元素最先弹出,使用栈将链表元素顺序倒置。从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中即可
代码实现:
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
ListNode* tmp=head;
vector<int> res; //动态数组实现输出
stack<int> res1; // 利用栈的特性实现反向输出
while(tmp!=NULL){ //将链表中的元素先储存到栈中
res1.push(tmp->val);
tmp=tmp->next;
}
while(!res1.empty()){ //从栈中弹出实现反向并存入数组中
res.push_back(res1.top());
res1.pop();
}
return res; //返回数组
}
};
时间复杂度分析:
开始对链表遍历一遍,压入栈后,还有对栈进行全部弹出,容易看出时间复杂度为O(n).
空间复杂度:
额外开辟了一个栈,一个数组,所以空间复杂度为O(n).