【问题标题】:C++ LinkedList Recursion function: Remove first element if value is found in listC ++链表递归函数:如果在列表中找到值,则删除第一个元素
【发布时间】:2015-04-23 12:32:37
【问题描述】:

我正在尝试编写的函数: bool LinkedList::removeFirst(Node *node, int v);

如果在列表中找到 v,则返回 true 并删除列表的第一个元素。如果 v 不在列表中,则返回 false。

我对解决方案的尝试:

bool LinkedList::removeFirst(Node *node, int v) {
    if(h==NULL)
      return false;
    if(h->value==v) 
      return true;
    else {
      bool result = findNum(h->next,v);
      if(result == true){
        Node *n = node;
        free(n);
      } else {
        return false;
      }
    }
}

我知道我当前的解决方案将删除列表中的每个节点,但我想不出一种只删除递归实现中的第一个节点的方法。

【问题讨论】:

  • 您是要删除列表的绝对第一个元素,还是第一次出现的值v?
  • 另外,在函数removeFirst的当前接口下,如果你最终删除了第一个元素,你将丢失你的列表,因为没有办法修改指向第一个元素的指针外部保存的列表元素。为此,您必须向我们展示LinkedList 类的相关部分,或者修改函数以接受指向指针的指针或类似的东西。
  • 哦,我刚刚意识到我的错误,该函数要求您删除具有值为 v 的实例的第一个节点。我的印象是您必须删除列表的绝对第一个元素。我知道从这里怎么走,谢谢你的帮助!
  • 我的第二条评论仍然有效。您的函数签名有问题。你要么拿/还得太多,要么不够。
  • 链表类有一个指向第一个节点的指针,称为“head”。因此,如果值为 v 的节点恰好是第一个元素,我将不得不将 head 重新分配给第二个元素以避免丢失列表?

标签: c++ class recursion linked-list


【解决方案1】:

这是一种方法:

bool LinkedList::removeFirst (int v)
{
    return removeFirstInSublist (&head, v);
}

bool LinkedList::removeFirstInSublist (Node ** node, int v)
{
    if (!node || !*node) return false;

    Node * p = *node;
    if (v == p->value)
    {
        *node = p->next;
        delete p;  // or free(p);
        return true;
    }

    Node * q = p->next;
    bool b = removeFirstInSublist (&q, v);
    if (q != p->next)
        p->next = q;  // This is the line that actually removes the node from the list.
    return b;
}

我相信这会起作用(但请注意,我还没有尝试过。)基本上,removeFirstInSublist 方法完成了工作,我们需要一个指向指针的指针,因为我们需要返回如果我们最终删除了它,它会替换我们传入的那个节点。 removeFirst 方法只是调用具有正确值的实际函数。

您可以选择将 sublist 方法设为私有或将其设为公开,但显然界面有点笨拙。我选择指向指针的指针而不是更友好的指针引用,因为(如果您选择将其公开)我希望用户知道他们传入的指针可能会被更改。

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 2020-02-14
    • 1970-01-01
    • 2020-05-14
    • 2013-12-10
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多