[英]remove an item from a linked list 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;
}
刪除第一個元素效果很好。 當我想從中心或末端刪除元素時,程序會刪除其左側的所有元素...
您需要修復代碼的getPreviousElement
。 現在,它執行的操作是檢查第一個元素是否在必需元素之前。 如果是,則正確返回。 如果否,則退出while循環並返回nullptr。 您需要繼續循環直到獲得元素。 我不會發布解決方案,因為它應該是您的學習練習。
您的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--;
}
}
但是,如果根本不使用getElement()
,則可以進一步極大地優化removeKey()
,因此避免了兩次遍歷列表的麻煩:
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()
以有選擇地返回上一個元素:
ListElement* getElement(int key, ListElement** previousElement = nullptr) {
if (previousElement) {
*previousElement = nullptr;
}
ListElement *element = firstElement;
ListElement *previousElement1 = nullptr;
while (element != nullptr) {
if (element->getKey() == key) {
if (previousElement) {
*previousElement = previousElement1;
}
return element;
}
previousElement1 = element;
element = element->getNext();
}
return nullptr;
}
void removeKey(int key) {
ListElement* previousElement;
ListElement *element = getElement(key, &previousElement);
if (element != nullptr) {
ListElement *nextElement = element->getNext();
if (previousElement != nullptr) {
previousElement->setNext(nextElement);
}
if (firstElement == element) {
firstElement = nextElement;
}
delete element;
size--;
}
}
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.