EDITED: 使用c ++编写代码。
void circularList::deleteNode(int x)
{
node *current;
node *temp;
current = this->start;
while(current->next != this->start)
{
if(current->next->value == x)
{
temp = current->next;
current->next = current->next->next;
delete current->next;
}
else{
current = current->next;
}
}
}
添加其他我很抱歉我忘了复制代码的那部分,是的,它是出于学习目的。我不熟悉使用c ++进行编码,可能会对此感到遗憾。
此代码行
this-> start-> value == x
我不确定你的意思或你认为它的去向,是的,链表中有节点,并假设它始终总是有至少1个节点。
答案 0 :(得分:6)
想想这两行:
current->next = current->next->next;
delete current->next;
尝试确定您实际删除的内容(不是current->next;
,至少不是您要删除的内容)。
答案 1 :(得分:6)
您永远不会移动到while循环中的下一个节点。在你的if之后,你应该:
else
current = current->next;
此外,您可能需要考虑在找到节点后从函数返回(除非您怀疑两个节点具有相同的值)。
答案 2 :(得分:3)
除了Justin's和Let_Me-Be's答案外,请考虑在
时可能需要注意的事项this->start->value == x
如果你没有处理这个权利,你将丢失整个清单(或试图达到它的崩溃)......
答案 3 :(得分:1)
您是否只有一个单一链接列表?
您是否考虑过STL,可能是deque
?
或者,如果你必须有一个链表,那么为什么不采取90%STL(;-)并查看Boost库?
你似乎在这里重新发明轮子。为什么不采用一些现有的和经过测试的代码并使用它?
答案 4 :(得分:0)
“从链接列表中删除节点”是问题还是“从 循环 链接列表中删除节点”问题?
从非圆形到圆形的区别在于:
while(current->next != this->start)
如果列表是非循环的,那就是
while(current->next != NULL )
除此之外,代码片段存在问题,其他人已经指出过。
答案 5 :(得分:0)
另一件事:在调用deleteNode之前,您是否检查过列表中至少有一个有效节点?
我问这个,因为你的函数没有检查start元素的NULL值。
解决方案是添加行
if(start == NULL)return
作为避免这种情况的方法的第一行。