从链表中删除节点
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
指针表示了一个空行,但您没有在代码中正确处理这种情况 - 如果runner
是NULL
,那么当您尝试时会崩溃在第一次检查中访问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】:
您没有更新循环内的temp
和runner
变量:
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
【讨论】:
以上是关于从链表中删除节点的主要内容,如果未能解决你的问题,请参考以下文章