代码问题:给定一个头节点为 head 的单链表用于记录一系列核心肌群训练编号,请将该系列训练编号 倒序 记录于链表并返回。
代码逻辑:通过递归的特性(结束后逐步返回)来实现反向链接
我的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* head_end;//最后的head头指针
ListNode* tmpptr;//迭代指针
bool pass(ListNode*& curptr) {
if (curptr != NULL && curptr->next != NULL) {//递归的依据是有没有到头
if (!pass(curptr->next)) {
return false;
}
tmpptr->next = curptr;
curptr->next = NULL;//为什么这一行删掉就出问题了
tmpptr = tmpptr->next;
return true;
} else {
head_end = curptr;
tmpptr = curptr;
return true;
}
}
ListNode* trainningPlan(ListNode* head) {
pass(head);
return head_end;
}
};
我的问题:
上述代码注释行curptr->next = NULL;为什么删掉就有问题了(报错显示:这表示你在尝试访问一块已经被释放的内存)?tmpptr->next = curptr;这句代码不是已经实现了对上一层递归中(按照返回的先后顺序)的curptr进行了重新链接了吗?