【问题标题】:Method to Delete duplicate-value nodes from a sorted linked list in c++C++中从排序链表中删除重复值节点的方法
【发布时间】:2014-08-15 12:40:02
【问题描述】:

我正在编写一个从 C++ 中的排序链表中删除重复值节点的方法。我正在尝试使用 Node* 而不是 void 返回类型,但由于 return 语句而面临错误。

我的方法代码..

    Node* RemoveDuplicates(Node *head)
     {
       struct Node* current = head;
       struct Node* next_next;
       if(current == NULL)
       return;

      while(current->next != NULL)
       {
         if(current->data == current->next->data)
          {
            next_next = current->next->next;
            free(current->next);
            current->next = next_next; 
          }
        else 
        {
            current = current->next;
        }
      }
  }

我收到的编译时错误消息..

   solution.cc: In function 'Node* RemoveDuplicates(Node*)':
   solution.cc:31:6: error: return-statement with no value, in function returning 'Node*' [-fpermissive]
   return ;
   ^

【问题讨论】:

  • 即使你的函数没有返回任何东西,你为什么还要使用Node *?
  • 错误信息很清楚,阅读一下。
  • 你正在用 C 编写。

标签: c++ pointers linked-list return


【解决方案1】:

我将把它当作一个学习练习,并忽略这样一个事实,即使用 std 列表比实现自己的链表更可取,使用 new 和 delete 比使用 malloc 和 free 更可取。

如果将 Node* 指定为返回类型,则必须返回指向节点的指针。为了回答你的问题,你要问的是:你想返回什么指针?如所写,您正在删除所有重复的指针。你想返回最后一个删除的指针吗?您要循环直到找到重复项并将其删除吗?

您的代码 sn-p 中有两个退出点。第一个是简单的“return”语句,当列表为空时调用。正如所写,您正在返回 void,即什么都没有。你需要返回一个指向 Node 的指针,但是你没有有效的指针,所以你可能想返回一个 null_ptr,它是一个空指针。

现在我们来到您的问题中取决于所需行为的部分。例如:

while(current->next != NULL)
   {
     if(current->data == current->next->data)
      {
        next_next = current->next->next;
        free(current->next);
        current->next = next_next; 
        ///  Here  you have a valid pointer you could return:
        return current;
      }
    else 
    {
        current = current->next;
    }
    // if you get here, no duplicates were found, so you can return a nullptr.
    return std::nullptr;
  }

将遍历您的列表,直到找到重复项,将删除该重复项,并返回指向剩余指针的指针。如果没有找到重复项,则返回 nullptr。

我将它保留为 exersize 来修改它以循环遍历列表中的所有元素,直到找到最后一个重复项(提示,您必须引入一个局部变量来存储返回值),然后返回它。

祝你好运。

【讨论】:

    【解决方案2】:

    编译器不会假装知道你在想什么,他会要求你就正在发生的事情签订合同。因此,声明返回类型 Node* 您必须提供该特定类型的输出:节点指针。我在这里可以想象的最有可能的情况是在函数末尾返回当前节点而没有重复项。

    Node* RemoveDuplicates(Node *head)
    {
        // some instructions
        return head;
    }
    

    所以你可以有这种语义:

    Node* distinctList = RemoveDuplicates(head);
    if (distinctList) // NULL (0 / false) if empty
    {
        // some more instructions
    }
    

    但是,如果您不需要任何东西从函数中取出,则返回类型应该是 void(无)。

    希望这会有所帮助!

    【讨论】:

    • 我尝试像你说的那样将 head 添加到“return head”语句中,但我收到了另一条错误消息...
    • 您还应该删除 return; 部分,它什么都不返回,或者最好用 return NULL; 替换它,因为在这种情况下,您已经知道从无中删除某些东西将变成无.
    【解决方案3】:

    将返回类型更改为void。

    函数没有返回任何有价值的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2022-01-07
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2017-10-21
      相关资源
      最近更新 更多