从单链表中删除节点?

时间:2016-05-04 03:43:59

标签: c++ linked-list singly-linked-list

我知道这个问题之前已被问过很多次,但我似乎无法弄清楚我得到的错误。这是我的代码:

int remove(ListNode * &head, int length)
{
    if(head != NULL)
    {
        string str = head->word;
        if(str.size() > length)
        {
            if(head->next->next != NULL)
            {
                head->word = head->next->word;
                ListNode* tempNode = head->next->next;
                delete head->next; //segfault
                head->next = tempNode;
                return 1 + remove(head->next, length);
            }
            else if(head->next != NULL)
            {
                head->word = head->next->word;
                delete head->next;
                head->next = NULL;
                return 1 + remove(head->next, length);
            }
            else
            {
                delete head;
                head = NULL;
                return 1 + remove(head->next, length); 
            }
        }
        else
        {
            return remove(head->next, length);
        }
     }

     return count;
}

目标是删除任何大小大于参数中指定长度的单词。当我尝试删除head->接下来时会发生错误,即使它显然存在并且我也可以打印出该单词。我得到的错误是

  

*“./a.out”出错:双重免费或损坏(输出):0x00007ffde3d4d7c0 * 已中止(核心转储)

我尝试在其上运行Valgrind,但无法解释输出,因为它没有指定任何行号。 感谢您对这个简单问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

  

注意:这个答案的第一部分是在OP编辑代码之前(见下面的新答案)

这部分:

" ".join()

很糟糕。

首先,你不应该设置:

head == NULL;
return remove(head->next, length, count + 1);
              ^^^^

应该是:

head == NULL; 
     ^^

此外,您不应该在之后再次调用该函数:

HEAD = NULL;

完成后(您刚刚删除了return remove(head->next, length, count + 1); 元素,因此head为NULL)。只需head(或您想要返回的任何值)。

  

回答编辑过的问题

新代码存在问题:

return 0;

一般来说,我不认为使用递归函数调用对这个问题有好处。非递归方法是:

        if(head->next->next != NULL)  // Here you know that head isn't NULL
        {                             // but head->next can still be NULL so
            ....                      // don't do head->next->next !
        }
        else if(head->next != NULL)   // This check should also be part
        {                             // of your first if-statement. Like:
            ....                      // if ((head->next != NULL) && (head->next->next != NULL))
        }
        else
        {
            ....
        }