我目前正在努力理解为什么我的 removeElement() 函数实际上没有从 LinkedList 中删除节点。这是我的代码:
template<typename T>
void LinkedList<T>::remove(T element) {
if (isEmpty()) {
cout << "List is empty.";
}
else if (head == tail) {
cout << "Only One" << endl;
head == NULL;
tail == NULL;
}
else {
cout << "Multiple in List" << endl;
Node<T>* curr = head;
Node<T>* prev = curr;
while (curr != NULL) {
if (curr->element == element) {
cout << "deleting " << element << endl;
prev = curr->next;
delete curr;
}
else {
prev = curr;
curr = curr->next;
}
}
if(curr == NULL) {
cout << element << " is not in list" << endl;
}
}
}
这段代码有效地定位了链表中的元素,但是无论出于何种原因,删除当前节点并没有真正从链表中删除该元素;即使在将我的前一个节点重新分配给下一个节点之后。在此期间,我将继续寻找文档,这可能会阐明我这边几乎肯定是愚蠢的疏忽,但我们将不胜感激任何帮助。
更新后的代码现在给了我很多美妙的 string_alloc 错误:
template<typename T>
void LinkedList<T>::remove(T element) {
Node<T>* current = head;
Node<T>* previous = current;
if (isEmpty()) {
cout << "List is empty.";
}
else if (head == tail) {
cout << "Only One" << endl;
}
else {
cout << "Multiple Nodes in List" << endl;
while (current != NULL) {
if (current->element == element) {
previous->next = current->next;
delete current;
break;
}
else {
previous = current;
current = current->next;
}
}
}
}
此时我怀疑它更多地与我从一个节点过渡到另一个节点的方式有关,具体而言:
previous = current;
current = current -> next;
我仍然没有正确地为列表中的单个元素创建一个案例,只有当我试图删除任何节点时才会抛出错误。
最佳答案
你有几个问题:
问题1
else if (head == tail) {
cout << "Only One" << endl;
head == NULL;
tail == NULL;
}
如果您的列表只有一个元素,您可以将 head 和 tail 设置为 null1,但永远不要释放元素本身。此外,如果列表中的那个元素不是您要删除的元素怎么办?
<子>1。参见问题 2。
问题2
您永远不会真正将 head 或 tail 设置为 null。
head == NULL;
是一个 bool 表达式,检查是否 head
等于NULL
.这应该是 head = NULL;
2
<子>2。参见问题 3。
问题3
问题4
prev = curr->next;
这只是改变局部指针prev
指向不同的节点。您需要更改该节点的 next
指针代替。应该是:
prev->next = curr->next;
问题5
您不考虑列表中有多个元素的特殊情况,但您要删除的元素是第一个或最后一个(这意味着必须重新分配头或尾)。
还有一些小事,比如可能在找到要删除的节点后立即返回(除非您试图删除所有符合条件的节点。您的意图不明确,没有评论)。此外,可以通过将其拆分为两个函数来提高可读性/可维护性,一个 Node<T> find(T element)
和一个 void remove(Node<T> n)
.这也应该使边缘情况更容易处理。但除了这些小事之外,上面的列表至少应该让您的代码按您预期的方式工作。
关于c++ - 从链表中删除元素 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47099833/