运行时错误-地址释放后堆使用



我被一个问题卡住了,不明白为什么我在空闲后使用运行时错误堆。我读到过,当我们释放一些内存,然后用指针访问它时,可能会出现这个错误,但在我的代码中,我没有释放任何东西,所以为什么会出现这个问题。让我解释一下,我有一个3个节点的链接列表0->2->1->NULL。目前,我的指针second指向2,我只想更改链接1->2.现在,当我指定pre=NULL时,cur=second->接下来,它工作正常并成功运行,但当我执行pre=second和cur=second->接下来它会给出这个运行时错误。我的意思是,我不在乎2应该指向NULL,让2指向1,但我希望我的1应该指向2。这是代码:这给出了运行时错误。而在我的本地编译器中,它运行成功。由于这个问题是关于leetcode的,在leetcode中我看不到主要功能。

#include<iostream>
using namespace std;
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:
int length(ListNode* temp)
{
int count=0;
while(temp!=NULL)
{
temp=temp->next;
count++;
}
return count;
}
bool isPalindrome(ListNode* head)
{
bool flag=1;
int len=length(head)/2; //FUNCTION TO RETURN LENGTH OF LINKED LIST
ListNode *first=head,*second=head;
for(int i=1;i<=len;i++)
{
second=second->next;
}
ListNode *pre=second,*cur=second->next;
while(cur!=NULL)
{
ListNode *temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
for(int i=1;i<=len;i++)
{
if(first->val!=pre->val)
{
flag=0;
break;
}
first=first->next;
pre=pre->next;
}
return flag;
}
};
int main()
{
bool ans;
ListNode *head=NULL;
ListNode *temp=new ListNode(0);
head=temp;
temp=new ListNode(2);
head->next=temp;
temp=new ListNode(1);
head->next->next=temp;
Solution obj1;
ans=obj1.isPalindrome(head);
cout<<ans<<endl;
}

这是正确的代码,只更改为pre=NULL,cur=second。顺便说一句,在下一次迭代中,pre将变为第二个,cur将变第二个->接下来,它和上面给出运行时的解决方案相同。

ListNode *pre=NULL,*cur=second;
while(cur!=NULL)
{
ListNode *temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}

经过长时间的聊天,我们发现他正在更改并破坏原始链表中的链接,导致免费代码在完成后失败。我建议他一定要将数据返回到原始形式,或者至少使其在完成后可以访问列表中的每个节点。

我猜您正在求解234。如果是这样的话,那么这一切都会过去:

struct Solution {
ListNode* temp;
bool isPalindrome(ListNode* head) {
temp = head;
return is_palindrome(head);
}
private:
bool is_palindrome(const ListNode* node) {
if (node == NULL) {
return true;
}
bool check_for_palindrome = is_palindrome(node->next) & (temp->val == node->val);
temp = temp->next;
return check_for_palindrome;
}
};

但不确定你的bug!


参考文献

  • 有关更多详细信息,请参阅讨论板。有很多公认的解决方案,包括各种语言和解释,有效的算法,以及渐近时间/空间复杂性分析1,2

相关内容

  • 没有找到相关文章