删除双链表中的节点不起作用

Deleting node in a double linked list is not working

这是一个基本函数,它获取一个迭代器位置并删除该位置的节点,但它给我一个运行时错误。我做错了什么?

iterate erase(iterate position)
{
    iterate i;
    Node<T>* temp = head;
    if (head == NULL) {
        cout << "empty list" << endl;
    }
    else if (position.pointer == head) {
        head = temp->next;
        temp->next->previous = NULL;
        delete position.pointer;
    }
    else {
        while (temp != NULL) {
            if (temp == position.pointer->previous) {
                temp->next = position.pointer->next;
                temp->next->previous = temp;
                i.pointer = temp->next;
                delete position.pointer;
                return i;
            }
        }
    }

您的函数缺少足够的 return 语句。有多个流程可以导致函数退出,但只有其中一个有return语句。因此 return 值在很大程度上将是 不确定的 ,导致任何尝试使用 return 值的调用者出现 未定义的行为 .

在任何情况下,您的 while 循环都会永远迭代,因为您不会在循环的每次迭代中更新 temp。如果 position 指向列表中的最后一个节点,您也有一个 NULL 指针取消引用,因为在访问 temp->next->previous.

之前您没有检查新的 temp->next 是否为 NULL

但是,您真的根本不需要 while 循环 。关于 double 链表的事情是,给定列表中的 any 节点,你有 direct 访问两侧围绕它的节点。因此无需迭代列表寻找节点。

尝试更像这样的东西:

iterate erase(iterate position)
{
    Node<T> *temp = position.pointer;
    if (!temp) return end();

    Node<T> *next = temp->next;
    Node<T> *previous = temp->previous;

    if (next) next->previous = previous;
    if (previous) previous->next = next;
    if (temp == head) head = next;
    //if (temp == tail) tail = previous;
    delete temp;

    iterate i;
    i.pointer = next;
    return i;
}

或者:

iterate erase(iterate position)
{
    Node<T> *temp = position.pointer;
    if (!temp) return end();

    Node<T> *dummy; // <-- only if no tail ...
    Node<T> **previous = (temp->next) ? &(temp->next->previous) : &dummy/*&tail*/;
    Node<T> **next = (temp->previous) ? &(temp->previous->next) : &head;

    *previous = temp->previous;
    *next = temp->next;
    delete temp;

    iterate i;
    i.pointer = *next;
    return i;
}