我目前正在努力理解为什么我的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;
我仍然没有为列表中的单个元素正确创建一个案例,只有当我尝试删除任何节点时才会抛出错误。
答案 0 :(得分:6)
你有一些问题:
else if (head == tail) {
cout << "Only One" << endl;
head == NULL;
tail == NULL;
}
如果您的列表只有一个元素,则将head和tail设置为null 1 ,但永远不要释放元素本身。此外,如果列表中的一个元素不是您要删除的元素,该怎么办?
<子> 1。见问题2.
您实际上从未将头部或尾部设置为空。
head == NULL;
是一个布尔表达式,用于检查head
是否等于NULL
。这应该是head = NULL;
2
<子> 2。见问题3.
prev = curr->next;
这只是将本地指针prev
更改为指向不同的节点。您需要更改该节点的next
指针。它应该是:
prev->next = curr->next;
您不会考虑列表中包含多个元素的特殊情况,但您尝试删除的元素是第一个或最后一个(意味着必须重新分配头部或尾部)。
还有一些小的东西,比如可能在找到要删除的节点后立即返回(除非您尝试删除符合条件的所有节点。如果没有注释,您的意图就会模糊不清)。此外,通过将其分为两个函数Node<T> find(T element)
和void remove(Node<T> n)
,可以提高可读性/可维护性。这也应该使边缘情况更容易处理。但除了这些小事之外,上面的列表应该让你的代码工作起来就像你期望的那样。