首页 文章

删除循环链表中的节点

提问于
浏览
1

我有一个基本的链表问题,我试图在下面解决 . 我会很感激我的方法,算法的正确性(甚至编码风格)的任何输入 . 该问题需要一个函数来删除循环链表中所有出现的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;
}

2 回答

  • 1

    delete node; 应为 delete del; .

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

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

  • 1

    如果不遵循您的所有逻辑,我一眼就看出这段代码无法运行 .

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

    这个问题也有一个微妙之处 . 要检查是否已完成循环列表,您需要与第一个地址进行比较,以查看是否已链接回到开头 . 但是,如果已删除此元素,则按C标准删除 not even allowed to use its address in a comparison .

    为了避免对要删除的元素进行两次传递,一个可能的技巧是在开始迭代时"break the loop",这样您就可以检查 NULL 而不是检查起始节点的地址 .

相关问题