c++ - 删除链表 C++ 中的重复项(段错误)

标签 c++ linked-list

我不确定为什么会出现此段错误。我认为这可能与列表遍历有关。我猜最后,它仍在尝试遍历,但看到的是 nullptr。

我试过在其中放置另一个条件来检查 nextNode 是否为 nullptr 然后停止遍历,但我无法让它工作。

我错过了什么?

void LinkedList::removeDuplicates() 
{
    Node* traverse = m_front;
    Node* nextNode = traverse->getNext();
    Node* duplicate = nullptr;

    if (!isEmpty())
    {
         while(traverse != nullptr)
         {
             if (traverse->getValue() == nextNode->getValue())
             {
                std::cout << "Found duplicate\n";
                duplicate = nextNode;
                nextNode = nextNode->getNext();

                delete duplicate;
                duplicate = nullptr;

                traverse->setNext(nextNode);
            }

            traverse = nextNode;
            nextNode = nextNode->getNext();
        }
    }
}

最佳答案

您的代码假定列表已排序,否则它根本无法工作。

如果链表为空,则traverse为null,nextNode初始化会崩溃。

最后一行也会崩溃,因为最后一次遍历会为null,nextnode也会为null。

我只是重新排列 nextNode 并更改 while 条件:

void LinkedList::removeDuplicates() 
{
    Node* traverse = m_front;
    Node* duplicate = nullptr;

    if (!isEmpty())
    {
        Node* nextNode = traverse->getNext();
        while(nextNode != nullptr)
        {
             if (traverse->getValue() == nextNode->getValue())
             {
                std::cout << "Found duplicate\n";
                duplicate = nextNode;
                nextNode = nextNode->getNext();

                delete duplicate;
                duplicate = nullptr;

                traverse->setNext(nextNode);
                continue;  // Don't advance again, we already skipped an element.
            }

            traverse = nextNode;
            nextNode = nextNode->getNext();
        }
    }
}

编辑:添加了继续以避免删除最后一个元素的问题和连续跳过三个重复项的问题。

关于c++ - 删除链表 C++ 中的重复项(段错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35544705/

相关文章:

c++ - 如何将 Allegro 库与 Ubuntu Allegro 应用程序捆绑在一起?

c++ - 如何在 Visual Studio 中更改访问修饰符后的代码缩进

java - 使用自定义 LinkedList 类的薪资系统

c++关于在自身中嵌入结构名称的困惑

c++ - OpenCV - 套接字接收到失真图像

c++ - 模板返回如何处理?

c - 如何访问已释放内存位置的节点内的数据?

python - python递归中的链表

c++ - INT_MAX + (-1) 是未定义的行为吗?

c++ - 合并 2 个链表并附加到链表的末尾 C++