【问题标题】:Removing a node from a linked-list从链表中删除节点
【发布时间】:2013-01-08 02:24:59
【问题描述】:

我创建了一个哈希表,我想从链表中删除一个节点。该代码适用于删除第一个节点,但不适用于删除其他节点。

void intHashTable::remove(int num){
int location = ((unsigned)num) % size;
Node * runner = table[location];
int checker;

if(runner->next == NULL){
    if(num == table[location]->num){
        table[location] = NULL;
    }
}else{
    if(table[location]->num == num){
        table[location] = table[location]->next;
    }else{
        //This part doesn't seem to be working.
        Node *temp = runner->next;
        while(temp != NULL){ 
            if(temp->num == num){
                runner->next = temp->next;
                delete(temp);
                break;
            }
        }
    }
}

}

【问题讨论】:

  • 但是您已经尝试过什么?你发现了什么?在要求无偿支持时,请表现出一些努力。
  • @phresnel 我不要求无偿支持。我的代码在那里 - 这是我的努力。
  • 那么,你已经尝试了什么?你发现了什么? “它不起作用”根本没有问题的努力。它不编译吗?它是否会因异常而崩溃?你有无限循环吗?你会内存不足吗?调试器说什么?仅举几个例子。

标签: c++ linked-list hashtable nodes


【解决方案1】:

您尚未更新 temp 以指向循环中的下一项:

temp = temp->next;

您的表中似乎还用NULL 指针表示了一个空行,但您没有在代码中正确处理这种情况 - 如果runnerNULL,那么当您尝试时会崩溃在第一次检查中访问runner->next。此外,在某些情况下,您无法删除节点。

要解决这些问题,您可以将代码更新为以下内容:

void intHashTable::remove(int num)
{
    int location = ((unsigned)num) % size;
    Node * runner = table[location];

    if (runner != NULL) {
        if (runner->num == num) {
            delete runner;
            table[location] = NULL;
        } else {
            while (runner->next != NULL) {
                if (runner->next->num == num) {
                    Node *temp = runner->next;
                    runner->next = runner->next->next;
                    delete temp;
                    break;
                }
                runner = runner->next;
            }
        }
    }
}

另外请注意,我已经从 delete 中删除了括号,这是一个 C++ 关键字,而不是一个函数。

如果你使用双向链表(即使用前一个指针和下一个指针),那么你可以稍微简化一下这段代码,尽管对于像哈希表这样你只倾向于在一个方向上迭代的东西,它可能不值得花费额外的指针(在 64 位系统上每项额外 8 个字节)。

【讨论】:

  • 删除后他跳出循环。
  • 还有runner = temp 在您的行前。虽然通常不是用temp 达到顶峰,但我看到这篇文章是为了记住prev(但它应该可以工作)。
  • 这行不通。当前指针更新必须在if之外完成
  • 我很确定这些 cmets 适用于我的答案的先前版本,公平地说,它太简洁而无法清晰。我已经对其进行了编辑以显示一个重写的函数,该函数修复了几个问题。
【解决方案2】:

您没有更新循环内的temprunner 变量:

    while(temp != NULL)
    { 
        if(temp->num == num)
        {
            runner->next = temp->next;
            delete temp;
            break;
        }
        runner = temp;     // Keep previous element to change its next pointer when num found
        temp = temp->next; // Advance current pointer to next element
    }

【讨论】:

    猜你喜欢
    • 2017-10-21
    • 2013-08-30
    • 2020-02-04
    • 2019-05-10
    相关资源
    最近更新 更多