我实现了一个双向链表。问题是删除具有特定值的节点。为此,我首先必须在列表中找到该值。如果存在,则必须删除它,并相应地设置其余的指针。我什至尝试通过使用“免费”而不是“删除”来删除,但在我的情况下也不起作用。代码中没有错误,但是执行后该节点不会被删除。 这是我的代码:
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;
}
}
}
P.S我以相同的方式为所有可能的情况编写了代码。
此类的析构函数写为:
~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。
答案 0 :(得分:2)
除了显示的内容不是您的真实代码之外,
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;
}