我已经实现了一个双向链表。问题是删除具有特定值的节点。为此,我首先必须在列表中找到该值。如果它存在,我必须删除它,相应地设置其余指针。我什至尝试使用"免费"而不是"删除"进行删除,但这在我的情况下也不起作用。代码中没有错误,但节点在执行后不会被删除。 这是我的代码:
void remove(i)
{
node *n= find(i);
node *prev= n->GetPrev();
node *next=n->GetNext();
if(n!=NULL)
{
if(prev!=NULL && next!=NULL)
{
prev->SetNext(next);
next->SetPrev(prev);
delete n;
}
else if(prev!=NULL && next==NULL)
{
prev->SetNext(NULL);
delete n;
}
}
}
附言我以相同的方式为所有可能的情况编写了代码。
此类的析构函数编写为:
~DL()
{
node *current = head;
while (current)
{
node<T> *next = current->GetNext();
delete current;
current = next;
}
delete head;
delete tail;
}
我在列表中插入了不同的整数值。插入工作正常。但是当我尝试使用循环删除插入到列表中的节点时,返回了以前在头部的相同节点,显示它以前没有被删除。checkRemove 函数实现这些步骤。
checkRemove()
{
for (int i = 0; i < 50; i++)
{
addToHead(i);
}
while(length>10)
node *temp= returnHead();
if (temp != NULL)
cout<<"Value of head node is "<<temp->returnValue()<<endl;
remove(temp->returnValue());
}
就我而言,因为列表中的值是不同的,因此它们只出现一次。print 语句仅打印两次"头节点的值"语句,而不是打印值,直到列表的长度变为 9。
除此之外,你展示的不可能是你的真实代码,
void remove(i) { node *n = find(i); node *prev = n->GetPrev(); // **** crash if n == NULL node *next = n->GetNext(); if (n != NULL) // **** is too late, execution will never reach this if n == NULL { if (prev != NULL && next != NULL) { prev->SetNext(next); next->SetPrev(prev); delete n; } else if (prev != NULL && next == NULL) { prev->SetNext(NULL); delete n; } // n won't be deleted if both prev and next are nullptr } }
更简单:
void remove(int value)
{
node *n = find(value);
if (!n) return; // nothing to do
node *prev = n->GetPrev();
node *next = n->GetNext();
if (prev) prev->SetNext(next);
if (next) next->SetPrev(prev);
delete n;
}