从链接列表中删除项目C ++

时间:2018-11-05 19:26:19

标签: c++

我的物品移除功能有问题

void removeKey(int key) {
     ListElement *element = getElement(key);
         if (element != nullptr) {
             ListElement *nextElement = element->getNext();
             ListElement *previousElement = getPreviousElemnt(element);
             if (previousElement == nullptr) {//pierwszy element
                 firstElement = nextElement;
             } else if (nextElement == nullptr) { //
                   previousElement->setNext(nullptr);
             } else {
                   previousElement->setNext(nextElement);
             }
             delete element;
             size--;
         }
     }
}

 ListElement *getPreviousElemnt(ListElement *element) {
        ListElement *element1 = firstElement;
        if (element1 != nullptr) {
            while (element1->getNext() == element) {
                return element1;
            }
        }
        return nullptr;
    }

删除第一个元素效果很好。 当我想从中心或末端删除元素时,程序会删除其左侧的所有元素...

3 个答案:

答案 0 :(得分:2)

您需要修复代码的getPreviousElement。现在,它执行的操作是检查第一个元素是否在必需元素之前。如果是,则正确返回。如果否,则退出while循环并返回nullptr。您需要继续循环直到获得元素。我没有发布解决方案,因为它应该是您的学习练习。

答案 1 :(得分:2)

您的getPreviousElemnt()无法正确循环。它看起来应该更像这样:

ListElement *getPreviousElemnt(ListElement *element) {
    ListElement *element1 = firstElement;
    while (element1 != nullptr) {
        ListElement *nextElement = element1->getNext();
        if (nextElement == element) {
            return element1;
        }
        element1 = nextElement;
    }
    return nullptr;
}

您的removeKey()不需要那么多的if..elseif..else块,可以简化为:

void removeKey(int key) {
    ListElement *element = getElement(key);
    if (element != nullptr) {
        ListElement *nextElement = element->getNext();
        ListElement *previousElement = getPreviousElemnt(element);
        if (previousElement != nullptr) {
            previousElement->setNext(nextElement);
        }
        if (firstElement == element) {
            firstElement = nextElement;
        }
        delete element;
        size--;
    }
}

但是,如果您根本不使用removeKey(),则可以{em>进一步进行进一步优化,从而避免重复遍历该列表两次:

getElement()

或者,更新void removeKey(int key) { ListElement *element = firstElement; ListElement *previousElement = nullptr; while (element != nullptr) { if (element->getKey() == key) { ListElement *nextElement = element->getNext(); if (previousElement != nullptr) { previousElement->setNext(nextElement); } if (firstElement == element) { firstElement = nextElement; } delete element; size--; return; } previousElement = element; element = nextElement; } } 以选择返回前一个元素:

getElement()

答案 2 :(得分:0)

ListElement *getPreviousElemnt(ListElement *element) {
        ListElement *element1 = firstElement;
        if (element1 != nullptr) {
            while (element1->getNext() != element) {  //<----change this
                element1 = element1->getNext();
            }
             return element1; //<-----return previous
        }
        return nullptr;
    }