这是我的代码:
template<class L>
Node<L>* LinkedList<L>::DeleteNode(L toDelete)
{
Node<L>* current;
Node<L>* trail;
if(head == NULL)
{
cout << "\n\nCannot delete from an empty list.\n\n";
}
else
{
if(head->next == NULL)
{
if(head->data == toDelete)
{
current = head;
delete current;
head = current;
tail = current;
cout << "\nObject found. The list is now empty.\n";
}
else
{
cout << "\nObject not found.\n";
}
}
else
{
current = head;
while(current->data != toDelete && current->next != NULL)
{
trail = current;
current = current->next;
}
if(current->data == toDelete)
{
if(current->next == NULL)
{
trail->next = NULL;
current = trail;
}
else
{
// having error here
trail->next = current->next;
current = trail;
delete trail;
}
cout << "\nNode found and deleted.\n";
}
else
{
cout << "\nObject not found.\n";
}
}
}
return head;
}
我标记了我遇到问题的具体行(当尝试从中间删除节点时(当next不为null时))。我已尝试过该块的多种变体,但仍然没有。
非常感谢所有帮助!
答案 0 :(得分:0)
在这个阶段,你只是简单地让错误的节点退出: trail正在保存应该删除的节点的最后一个节点。 试试这个:
{
trail->next = current->next;
delete current;
//you may want to add: current=trail->next; if you are planing to keep working with
// the rest of the list
}
您还应该检查以下代码块:
if(current->next == NULL)
{
trail->next = NULL;
current = trail;
}
你实际上并没有在这里解决问题,它应该是:
if((current->next == NULL)
{
trail->next = NULL;
delete current;
}
答案 1 :(得分:0)
看起来你正在分配地址当前点,与路径点相同,然后释放该资源,我认为这不是意图。
现在你实际上正在拆分列表,因为你在删除跟踪之前重新分配当前指向跟踪(当你想要释放当前时,基于你的while循环指向你要删除的内容)
更有意义的是:
trail->next = current->next;
delete current;
我不确定你的其他案例是如何按预期工作的......代码看起来很有趣。例如,在你的情况下它是列表的末尾你没有释放任何资源(但你刚刚删除了一些东西,为什么没有资源被释放?)在删除头部的情况下,你丢失了你的列表并使用当前的实现创建了内存泄漏。
所有这一切 - 这是一个良好的开端,但我会退后一步,为你的链表提供的接口提供有效的原型,并列出可能的边缘情况(例如删除头部)。