输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
看到这个题目,有两个想法:一是先反转链表,再从头到尾打印节点,但这样会修改原链表的结构。
而是从头到尾打印链表,放入输出vector中,再反转vector。
#include<cstdlib>
#include<vector>
#include<iterator>
#include<stack>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> rev;
stack<int> stk;
ListNode* node = head;
int temp;
while(node != NULL)
{
stk.push(node->val);
node = node->next;
}
while(!stk.empty())
{
temp = stk.top();
rev.push_back(temp);
stk.pop();
}
return rev;
}
};
调错总结:
由于对STL容器的使用方法不是很熟悉,出现了很多错误。
(1)pop与top:pop()弹出栈顶元素并不返回栈顶元素,top()返回栈顶元素,不会删除栈顶元素。
所以这里报错:把void类型赋给int类型有误。
(2)怎么往vector中添加元素呢?开始 rev[pos] = temp,报错,应该是数组越界了,都没有rev第i个元素都不存在,怎么引用它给它复制呢。查看了vector的insert声明,两个参数,第一个参数iterator类型,表示插入的位置,第二个是插入的值。通过了,后面才此知道有个push_back()方法直接往vector后面添加元素啊。
。。。。。。。
递归的方法
#include<cstdlib>
#include<vector>
#include<iterator>
#include<stack>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> rev;
if(head != NULL)
{
if(head->next != NULL)
{
printListFromTailToHead(head->next);
}
rev.push_back(head->val);
}
return rev;
}
};
报错,应该是在递归函数里放return不合适,如果传入vector的引用就好了,这样就可以在里面修改vector,而返回值为void,原问题是打印节点没有返回值所以可行。