【问题标题】:Deleting a node in circular linked list删除循环链表中的节点
【发布时间】:2013-04-24 06:29:08
【问题描述】:

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

【问题讨论】:

  • 您要求样式 cmets,所以这里是一个。您应该创建一个 List 类,并且 deleteNode 应该是该类的私有成员。您应该考虑您的代码呈现给代码用户的界面。 List 类的用户不需要或想了解节点,他们只想在列表中添加和删除项目。查看 std::list 以获得良好设计的示例。

标签: c++ linked-list circular-list


【解决方案1】:

delete node; 应该是 delete del;

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

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

【讨论】:

  • 是否需要放一个;在结构之后?我以为那只是为了上课
  • @yzn-pku 谢谢!第一个问题是一个错字:) 关于第二点,如果我错了,请纠正我,但我认为如果我使用“Node* 节点”,那么我不会更改实际的节点指针。这就是为什么我使用对节点指针的引用。是的,将在 struct 之后添加分号 :)
  • @Jesse,在 C++ 中,结构和类几乎是一回事,唯一的区别是默认访问修饰符:结构是 public,类是 private
  • @KT100 是不是还要通过参数返回节点?如果不是,则不需要 &。
【解决方案2】:

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

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

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

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

【讨论】:

  • 需要删除所有元素的极端情况是一个很好的问题。这段代码肯定会失败。你会如何建议修改 while 循环来解决这个问题?我正在考虑确保将要删除的指针设置为 NULL,以便我们确保最终返回的变量节点在这种情况下等于 NULL。请注意,我最后只检查列表的第一个元素,因此您的第二条评论将不是有效的 AFAIK。另外,您能否进一步详细说明(通过代码示例)打破循环?谢谢!
  • 我现在花时间实际阅读了您的代码,我发现您的方法存在另一个问题。如果最后你发现given 节点必须被删除,你还需要修复链接到它的指针。例如,给定列表(2, 3, 4, 2, 5, 7),如果给定第一个2,并被告知删除所有2,则循环后您将得到(2, 3, 4, 5, 7),然后检查是否删除given,但您也需要修复节点7next指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多