当前位置: 首页 > 知识库问答 >
问题:

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

太叔经赋
2023-03-14
#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=second和cur将变为second->next,这与上面给出的运行时解决方案相同。

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

共有1个答案

微生昌胤
2023-03-14

我想你在解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;
    }
};

但对你的虫子不确定!

  • 有关其他详细信息,请参阅讨论板。这里有许多公认的解决方案,包括各种语言和解释、有效的算法以及渐近时间/空间复杂性分析1,2
 类似资料:
  • 我有一个Springboot应用程序,Mule作为微服务在docker容器中运行。即使空闲时也需要大约700MB。注意到JVM分配了380 MB的堆,这是使用参数提供的最大堆。虽然分配了最大堆,但微服务在空闲时只使用大约50 MB。问题是如何从JVM释放未使用的内存。 似乎减少MaxHeapFreeRatio我们可以要求JVM在有更多可用内存时收缩。然而没有太大区别,JVM也没有释放内存。但是当我

  • 因此,我知道对堆栈中分配的变量调用会导致无效指针错误。 在ED指针中,在实际指针之前分配8个字节,以保留关于指针大小的信息。因此,我想知道是否在一个结构之前做了一个,然后在该结构上调用free,是否可以释放该结构(当然,这偏离了分配这8个字节是所做的唯一额外的事情的假设)。 我想我的最后一个问题是,堆栈变量分配和堆分配之间是否有真正的区别(就后端对内核的调用而言)。

  • 它在我的Xcode中运行正常,所以有人能告诉我有什么问题吗? 我测试了,问题是在为堆栈重新分配空间,但我不明白这个错误…测试用例是[1,null,2,3],所以1是根,2是1的右子,3是2的左子。解决方案应该返回数组[1,2,3]。

  • 预备条件: Off-By-One 漏洞(基于栈) VM 配置:Fedora 20(x86) 继续使用已经被释放的堆内存指针叫做释放后使用。这个漏洞会导致任意代码执行。 漏洞代码: 编译命令: $gcc -o vuln vuln.c $sudo chown root vuln $sudo chgrp root vuln $sudo chmod +s vuln 注意:不像上一篇文章,ASLR 在这里是

  • 问题内容: 我对golang相当陌生,并尝试使用chanel理解主要原理并编写基于古洛丁的代码。 在我使用的其他语言中,没有这样的工具,我不知道会出现这样的错误,例如恐慌… 我的代码: 但是在终端我得到了这个: 我如何确定问题出在哪里,如何很好地关闭古丁鱼,而不是将其留在流程中… ps原谅我我的菜鸟问题。请 问题答案: nil取消引用: 您正在尝试访问指针所引用的结构,但是该指针尚未设置为该结构的

  • 问题内容: 我是新手,尝试制作一个简单的网络爬虫。我不断收到“紧急情况:运行时错误:无效的内存地址或nil指针取消引用”,并且不知道如何解决该问题。我有一个“ advancedFetcher”功能和一个“basicFetcher”功能,在任何一个下都出现相同的错误。这个答案建议检查每个错误(我认为是错误),但仍然出现错误。谢谢! 编辑#1: 问题答案: 您的程序在惊慌之前打印错误吗?如果没有记错,