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