在有序链表中编写删除算法

时间:2013-10-19 12:55:08

标签: c++ algorithm linked-list

我正在尝试为有序链表编写删除算法。搜索和遍历我认为我已经失败但是删除让我适合。它每次都会崩溃。有人可以帮我解决这个问题吗?

我的ListNode课程中有一个名为head的{​​{1}}结构的私有指针。 TestLL结构包含ListNodeint Keydouble dataValue。如果找到并删除了要删除的节点,则该函数返回ListNode *next;如果找不到,则返回true

我的代码:

false

2 个答案:

答案 0 :(得分:0)

该功能可以查看以下方式(不测试)

bool TestLL::Delete( int key )
{
    ListNode *prev = nullptr, *current = head;

    while ( current && !( current->key == key ) )
    {
        prev = current;
        current = current->next;
    }

    if ( !current ) return false;

    if ( prev ) prev->next = current->next;
    else head = head->next;

    delete current;

    return true;
}

答案 1 :(得分:0)

在同一指针上同时使用deletefree肯定是个问题。

  • 如果您使用new分配内存,请使用delete
  • 如果您使用malloc,请提醒您自己使用的是C ++,并将其替换为new

如果back == NULL,则表示:

  • headNULL(在这种情况下,仅return false)或
  • 第一个元素是我们要删除的元素(在这种情况下,您需要从列表中删除head处的元素,即head = head->next; delete temp;

如果temp == NULL,则表示找不到该元素 - 您在这里正确地return false

如果temp != NULL,您需要删除tempback->next = temp->next; delete temp;

但只是使用指向指针的指针似乎更简单:

bool TestLL::deleteKey(int key)
{
    ListNode **current = &head;
    while (*current != NULL)
    {
        if ((*current)->key == key)
        {
            ListNode *temp = *current;
            *current = (*current)->next;
            delete temp;
            return true;
        }
        current = &(*current)->next;
    }
    return false;
}