删除循环链表c ++中的节点?

时间:2010-03-12 06:26:41

标签: c++ linked-list

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个节点。

6 个答案:

答案 0 :(得分:6)

想想这两行:

current->next = current->next->next;

delete current->next;

尝试确定您实际删除的内容(不是current->next;,至少不是您要删除的内容)。

答案 1 :(得分:6)

您永远不会移动到while循环中的下一个节点。在你的if之后,你应该:

else
    current = current->next;

此外,您可能需要考虑在找到节点后从函数返回(除非您怀疑两个节点具有相同的值)。

答案 2 :(得分:3)

除了Justin'sLet_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

作为避免这种情况的方法的第一行。