我的pop_back()函数应该删除双链接列表中的最后一个元素。但是,我当前的代码删除了最后一个两个元素,而不仅仅是一个。我已经设置了与此功能相似的pop_front()函数,该功能正常。我很难弄清楚自己做错了什么。
这是我的linkedlist标题的一部分,带有struct节点:
class linkedlist
{
private:
struct Node{
Node* next;
Node* prev;
element_type data;
};
Node* head;
Node* tail;
unsigned int numElements;
我的pop_back()函数来自linkedlist的公共部分:
void linkedlist::pop_back()
{
if (empty())
return;
else {
Node *delBack = tail;
Node *nodeToDelete = delBack;
delBack = delBack->prev;
delBack->next = NULL;
delete nodeToDelete;
tail = delBack;
numElements--;
}
}
如果问题不是立即明显的,则可能将错误埋在代码中的其他地方。仍在搜索。
尽管该函数并未同时删除两个节点,但是该函数是错误的。它不会检查tail->prev
是否等于nullptr
,并且当列表变为空时,它不会将head
设置为nullptr
。该功能可以以下方式看起来。
void linkedlist::pop_back()
{
if ( tail )
{
Node *nodeToDelete = tail;
tail = tail->prev;
if ( tail )
{
tail->next = nullptr;
}
else
{
head = nullptr;
}
delete nodeToDelete;
numElements--;
}
}