删除循环链表中的节点

Deleting a node in circular linked list

本文关键字:节点 循环链表 删除      更新时间:2023-10-16

我有一个基本的链表问题,我试图解决下面。我将感谢任何输入我的方法,算法的正确性(甚至编码风格)。该问题调用一个函数,该函数删除循环链表中出现的所有int,并返回列表中的任何节点或NULL(当列表为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;
}

delete node;应为delete del;

另外,使用Node* node作为参数,而不是Node* &node,这将防止非左值传入。

注。忘记了结构定义后的分号?:)

如果不遵循你所有的逻辑,我一眼就能看出这段代码不能工作。

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

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

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