1

我有一个基本的链表问题,我试图在下面解决。对于我的方法、算法的正确性(甚至编码风格),我将不胜感激。该问题需要一个函数来删除循环链接列表中所有出现的 int 并返回列表中的任何节点或 NULL(当列表为空时)。

这是我到目前为止的一些 C++ 代码:

struct Node{
    Node* next;
    int data;
};

Node* deleteNode(Node* &node, int num){

    if(!node){
        return NULL;
    }

    Node* given = node;
    Node* del;

    while(node->next != given){
        if(node->next->data == num){
            del = node->next;
            node->next = node->next->next;
            delete del;
        }
        node = node->next;
    }

    //Check if the first node needs to be deleted, with variable node pointing to last element
    if(given->data == num){
        node->next = given->next;
        delete given;
    }

    return node;
}
4

2 回答 2

1

delete node;应该delete del;是。

此外,Node* node用作参数,而不是Node* &node它会阻止非左值传入。

ps 在结构定义后忘记分号?:)

于 2013-04-24T06:45:05.080 回答
1

如果不遵循您的所有逻辑,我一眼就能看出该代码无法正常工作。

您正在检查输入列表是否为空,这是您的代码返回的唯一情况NULL。但是,如果传递给您一个必须删除所有元素的列表,会发生什么?

这个问题也有微妙之处。要检查您是否完成了循环列表,您需要与第一个地址进行比较,以查看您是否链接回起点。但是,如果此元素已被删除,那么根据 C++ 标准,您甚至不允许在比较中使用其地址

为了避免两次遍历要删除的元素,一种可能的技巧是在开始迭代时“打破循环”,以便您可以检查NULL而不是检查起始节点的地址。

于 2013-04-24T08:34:27.077 回答