从LinkedList中删除元素(C ++)

时间:2017-11-03 15:57:44

标签: c++

我目前正在努力理解为什么我的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 个答案:

答案 0 :(得分:6)

你有一些问题:

问题1

else if (head == tail) {
    cout << "Only One" << endl;
    head == NULL;
    tail == NULL;
}

如果您的列表只有一个元素,则将head和tail设置为null 1 ,但永远不要释放元素本身。此外,如果列表中的一个元素不是您要删除的元素,该怎么办?

<子> 1。见问题2.

问题2

您实际上从未将头部或尾部设置为空。

head == NULL;是一个布尔表达式,用于检查head是否等于NULL。这应该是head = NULL; 2

<子> 2。见问题3.

问题3

Don't use NULL.

问题4

prev = curr->next;

这只是将本地指针prev更改为指向不同的节点。您需要更改该节点的next指针。它应该是:

prev->next = curr->next;

问题5

您不会考虑列表中包含多个元素的特殊情况,但您尝试删除的元素是第一个或最后一个(意味着必须重新分配头部或尾部)。

还有一些小的东西,比如可能在找到要删除的节点后立即返回(除非您尝试删除符合条件的所有节点。如果没有注释,您的意图就会模糊不清)。此外,通过将其分为两个函数Node<T> find(T element)void remove(Node<T> n),可以提高可读性/可维护性。这也应该使边缘情况更容易处理。但除了这些小事之外,上面的列表应该让你的代码工作起来就像你期望的那样。