最近在准备考研复试,刷OJ上面的题目,其中遇到了让我们从尾到头输出单链表的值,其实应该是很容易的题目用一个栈就能解决,但是自己当时忽然大脑短路只想到了头插法,于是自己又创建一个链表用头插法进行复制然后输出,中间遇到了不少问题,最后才算磕磕绊绊的搞定!下面先贴代码,然后说下错处
代码部分
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> list;
if (head == NULL) {
return list;
}
ListNode * newHead = new ListNode;
ListNode * r = head;
while (r->next != NULL) {
ListNode *p = new ListNode;
p->next = NULL;
p->next = r->next->next;
p->val = r->next->val;
p->next = newHead->next;
newHead->next = p;
r = r->next;
}
int i = 0;
ListNode * q = newHead;
while (q->next != NULL) {
list.push_back(q->next->val);
i++;
q = q->next;
}
return list;
}
错误原因
上述代码看着好像是对的,但是在实际运行中是会出错的,错误如下
读取访问冲突,这个有点尴尬了,作为一个新手一直弄了好久才发现问题,问题就在下面的这句代码
ListNode * newHead = new ListNode;
这句代码看着是没有问题的,但是我们在创建一个新节点的同时因为这是一个指针类型,它会默认指向一个垃圾地址,因此我们在使用它之前必须要进行一次初始化,否则就会报错,因此我们要再加上一句
ListNode * newHead = new ListNode;
newHead->next = NULL; //保证newHead指针的指向不会发生冲突
这个错误应该是很多初学者容易犯的,特别像我这种没有接触过C++的人更是容易犯错!通过这个程序自己也总结了一些我平时没有在意的知识点
- vector创建数组 vector list 之前一直以为vector必须要在list后面写上数值,现在发现可以直接用这种形式
- vector数组赋值用到的方法 .push_back
- 巩固复习了一下头插法