牛客网:按链表值从尾到头的顺序返回一个ArrayList

最近在学习数据结构与算法,于是去牛客网的剑指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()是指向迭代器中末端元素的下一个,指向一个不存在元素,按照代码块中修改即可解决上述问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值