从尾到头打印链表
一、题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2] 输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
二、C++代码实现
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> ret;
ret.reserve(10);
while (head != NULL) {
ret.push_back(head->val);
head = head->next;
}
if (ret.size() >= 2) {
for(int i = 0, j = ret.size() - 1; i < j; i++, j--) {
int temp = ret[j];
ret[j] = ret[i];
ret[i] = temp;
}
}
return ret;
}
};
三、执行及提交结果
总结
由于输入是个单列表,取出列表的值至少要遍历一次,代码中只用了一轮循环提取列表的值,再使用一个循环调换值的顺序。vector容器本身会自动扩展,如果需要插入的元素比较多,最好提前使用reserve函数预先申请空间,避免插入元素时频繁申请内存和拷贝元素。通过增加reserve函数,内存消耗排名直接上升至92.47%,效果还是非常明显的。当然,可以先用栈存数据,再取出来输出,这样不用手动交换数据,也能达到逆序输出的目的,试了一下,使用了两个容器,内存占用没优势,使用起来倒挺方便,不用担心逆序算法出错,O(∩_∩)O哈哈~。
#include <vector>
#include <stack>
vector<int> reversePrint(ListNode* head) {
vector<int> ret;
stack<int> stk;
ret.reserve(10);
while (head != NULL) {
stk.push(head->val);
head = head->next;
}
while (stk.size() > 0) {
ret.push_back(stk.top());
stk.pop();
}
return ret;
}
|