【发布时间】:2014-01-31 23:57:55
【问题描述】:
我必须编写一个双向链表,我正在尝试实现erase(Type obj) 方法,该方法接受一个参数 obj 并遍历列表并删除具有元素 obj 的每个节点。
我面临的问题是,我从前面遍历链表,当我找到具有 obj 元素的节点时,我用 obj 元素更改节点之前和之后的节点的下一个/上一个指针.但是,我并没有删除带有 obj 本身的节点,据我所知 c++ 没有垃圾收集,因此具有 obj 的节点仍然悬在空中。如何删除?
我的擦除()
template <typename Type>
int Double_list<Type>::erase( Type const &obj ) {
if (empty()){
return 0;
}
if (size() == 1 && head()->retrieve() == obj){
list_head = nullptr;
list_tail = nullptr;
list_size--;
return 1;
}
//Counter to hold the number of items deleted
int count = 0;
//Iterating through the linked list
for (Double_node<Type> *ptr = head(); ptr != nullptr; ptr = ptr->next()){
if (ptr->retrieve() == obj){
ptr->previous_node->next_node = ptr->next();
ptr->next()->previous_node = ptr->previous();
count++;
// delete ptr; // This stops me from iterating through the for loop
list_size--;
}
}
return count;
}
【问题讨论】:
-
调整指针后,使用
delete关键字实际删除对象(释放它的内存)。 -
@ooga 如果我在更改 obj 节点之前和之后的节点指针之后执行
delete ptr,那么我将无法再遍历链表。由于删除后我无法访问 ptr->next() -
首先你将前一个和下一个节点的指针设置为它的新值,然后然后你
delete被删除的节点......这是问题所在? -
但是您已经将 ptr->next() 复制到前一个节点的下一个指针!实际上,您只需复制并使用它即可。
标签: c++ erase doubly-linked-list