最近在学习数据结构与算法,于是去牛客网的剑指offer中寻找与学习部分同知识点的题目来练习,中途遇上了许多问题,在下文中会介绍几种版本遇上的问题和产生问题的原因分析,希望能对同做本系列题目的人有一点帮助。
题目描述:
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
首先是题目提供的代码部分
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
}
};
针对题目和所提供代码部分,我的解题思路如下:
1:首先定义一个vector用来保存输入的*head里面的所有数据,此时是从头到尾的顺序存储
2:再定义一个vector,将上一个vector中的数据倒序存储到新定义的vector中就行了。
代码和存在问题如下:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ArrayList2;
int cnt = 0;
int k;
ListNode* a;
a=head;
if(head==NULL) return ArrayList2;//一
while (a){
a = a->next;
++cnt;
}
vector<int> ArrayList(cnt);//二
//vector<int> ArrayList;
while(head)
{
k = head->val;
ArrayList2.push_back(k);
head=head->next;
}
vector<int>::iterator y = ArrayList.begin();//三
//现在开始倒序排列
//for (vector<int>::iterator j = ArrayList2.end(); j > ArrayList2.begin(); j--)
for (vector<int>::iterator j = ArrayList2.end()-1; j >= ArrayList2.begin(); j--)//四
{
*y = *j;
y++;
}
return ArrayList;
}
};
代码块中标注一,二,三,四的即为出现过问题的地方,注释的部分即为错误的代码
一处的问题:程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)
一错误原因:未添加判断不为空的语句
二处的问题:程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)
二错误原因:本人猜测是因为没有限制vector定义的大小,超出了题目规定的空间大小
三处问题会出现在,没有定义vector的初始大小的时候,无法使用begin()函数,即没有cnt的时候
四处的问题:当使用被注释的那行语句的时候,会出现如下错误
由你的输出这部分可以看出,输出缺少了67,然后在头部多打印了一个0
查资料可知,end()是指向迭代器中末端元素的下一个,指向一个不存在元素,按照代码块中修改即可解决上述问题