从链表中删除节点

Posted

技术标签:

【中文标题】从链表中删除节点【英文标题】: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 我不要求无偿支持。我的代码在那里 - 这是我的努力。 那么,你已经尝试了什么?你发现了什么? “它不起作用”根本没有问题的努力。它不编译吗?它是否会因异常而崩溃?你有无限循环吗?你会内存不足吗?调试器说什么?仅举几个例子。 【参考方案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
    

【讨论】:

以上是关于从链表中删除节点的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的链表结构—从链表中删除元素

从链表中删除节点(递归)

从链表中删除总和值为0的连续节点

从链表 C++ 中删除节点

从链表中删除用户选择的节点,用 c 中另一个列表中的节点替换它们

递归地从链表中删除数据