【发布时间】:2021-06-02 15:40:49
【问题描述】:
我想知道是否可以在 C++ 中按值删除链表中的节点而不跟踪“先前”和“当前”节点。
我所做的是将下一个节点的信息复制到当前节点,将当前节点链接到下一个节点,然后删除下一个节点。
我尝试过类似下面的方法。但是,这仅在要删除的节点不是最后一个节点时才有效。我无法弄清楚如何容纳最后一个节点。
struct Node
{
int data;
Node* next;
};
void LinkedList::deleteNode(int item)
{
Node* tmpNode = m_head;
while (tmpNode != nullptr)
{
if (tmpNode->data == item)
{
if (tmpNode->next != nullptr) // not last node
{
// this works
Node* delNode = tmpNode->next;
tmpNode->data = tmpNode->next->data;
tmpNode->next = tmpNode->next->next;
delete delNode;
}
else // last node
{
// this does not work
delete tmpNode;
tmpNode = nullptr;
}
std::cout << "deleted item " << item << '\n';
return;
}
tmpNode = tmpNode->next;
}
std::cout << "delete failed: item " << item << " not found\n";
}
【问题讨论】:
-
如果你删除了实际的节点,它会工作并且效率更高。诀窍是跟踪您在循环中访问的上一个节点。将其 next 设置为当前节点的 next 并删除该节点。特殊情况是它是第一个或最后一个节点,但可以用几行额外的句柄来处理。
-
lakeweb 是正确的。您的代码不是您想要的原因是因为您实际上是在将数据复制到当前节点之后删除 next 节点。如果它是最后一个节点,则没有要删除的下一个节点。如果不引用前一个节点,则无法删除当前节点。
标签: c++ linked-list