我正在完成一项任务,而且我遇到了一个问题。所以我制作了一份双重链表。我想要一个删除函数,它将item作为参数,在列表中搜索该参数。当它找到包含该项的节点时,我必须删除该节点。我知道如何更改前一个和下一个指向该节点周围节点的指针。然而,一直困扰我的问题是,当我只更改节点之前的节点的下一个指针和节点之后的节点的前一个指针时,就像在下面的代码中一样,特定节点将仅从列表中断开但是它仍然会留在freestore中。如何从那里删除它,以便释放它所占用的内存?
以下是我的代码。请看一下:
template <class T>
void LinkedList<T>::deleteElement(T item)
{
ListItem<T> *curPtr;
curPtr = searchFor(item); // this function returns the pointer to the node which contains the item.
(curPtr->next)->prev = curPtr->prev;
(curPtr->prev)->next = tempPtr->next;
}
所以你看,curPtr正在断开连接,但我相信它仍然存在于freestore的某个地方。我该如何彻底摆脱它?
答案 0 :(得分:1)
您可以为ListItem类型创建erase_next()
方法吗?
我在类似的类中有类似的东西。希望它有所帮助。
void erase_next() {
// ensure it is not the last item
if(this->next != nullptr) {
// create a temporary pointer
ListItem<T>* tmp = this->next
// link next to the next item to the next item and change the
// next items previous item to this item
this->next = this->next->next;
next->prev = this;
// delete the old next item
delete tmp;
}
}
在您的功能中,您可以使用以下内容进行调用。感谢@davmac已编辑删除第一项
template <class T>
void LinkedList<T>::deleteElement(T item)
{
ListItem<T> *curPtr = searchFor(item);
if(curPtr->prev == nullptr) {
curPtr->next->prev = nullptr;
delete curPtr;
} else {
curPtr->prev->erase_next()
}
}
修改强>
我再次玩弄这个,你应该能够使用以下
来优化erase_next()
功能
void erase_next() {
if(this->next != nullptr) {
this->next = this->next->next
// We've already linked next so we can delete the handle
// with prev Note: this method is not possible with a
// single linked list and we would need the temp variable
delete this->next->prev
next->prev = this;
}
}
这样你就不必申报临时变量。