C ++双链表 - 使用pop_back()从尾部删除元素

时间:2016-12-08 01:03:02

标签: c++ nodes doubly-linked-list

我的pop_back()函数应该删除双向链表中的最后一个元素。但是,我当前的代码删除了最后的两个元素而不是一个。我已经设置了类似于这个的pop_front()函数,它的工作正常。我无法弄清楚我做错了什么。

以下是带有struct Node的链接列表标题的一部分:

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--;
    }
}

如果问题不是很明显,那么错误可能会隐藏在代码中的其他地方。还在寻找。

1 个答案:

答案 0 :(得分:0)

虽然该功能不会同时删除两个节点,但功能错误。它不会检查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--;
    }
}