我的物品移除功能有问题
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;
}
删除第一个元素效果很好。 当我想从中心或末端删除元素时,程序会删除其左侧的所有元素...
答案 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;
}