双向链表删除C++中的偶数

Doubly linked list delete even numbers in C++

本文关键字:删除 C++ 双向链表      更新时间:2023-10-16

我正在尝试从双向链表中删除所有偶数。

我考虑过这些情况:

  1. 空列表
  2. 开头为偶数,
  3. 末尾的偶数
  4. 列表中间的偶数
  5. 偶数不在列表中

我下面的代码无法正常工作:

void DoublyList::deleteEvens()
{
    if (first == NULL) {
        cerr << "Empty List" << endl;
    }

    else {
        Node *current = first;
        bool found = false;
        while (current != NULL && (!found)) {
            Node *tCurrent = current;
            if (current->getNextLink() == NULL) {
                if (current->getData() % 2 == 0) {
                    first = NULL;
                    last = NULL;
                    delete current;
                    current = NULL;
                    count = 0;
                }
                else {
                    cerr << "Not in the list" << endl;
                    found = true;
                }
            }
            else if (current == first && current->getData() % 2 == 0) {
                first = first -> getNextLink();
                first->setPreviousLink(NULL);
                current = current->getNextLink();
                delete tCurrent;
                tCurrent = NULL;
                -- count;
            }
            else if (current == last && current->getData() % 2 == 0) {
                last = last->getPreviousLink();
                last->setNextLink(NULL);
                delete current;
                current = NULL;
                -- count;
            }
            else if (current->getData() % 2 == 0) {
                current->getPreviousLink()->setNextLink(current->getNextLink());
                current->getNextLink()->setPreviousLink(current->getPreviousLink());
                current = current->getNextLink();
                delete tCurrent;
                tCurrent = NULL;
            }
            else {
                current = current->getNextLink();
            }
        }
    }
}

问题似乎是您的第一种情况:对于列表中的最后一项,current->getNextLink() == NULL评估为 true。因此,当您处理最后一项时,您有效地删除了整个列表。

我假设这是为了检测列表中的第一项,将其更改为:

if (current->getNextLink() == NULL && current->getPreviousLink() == NULL)

或者,将其移出循环并仅使用第一个变量。