0

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

这是我的带有结构节点的链表头的一部分:

class linkedlist
{
private:
    struct Node{
        Node* next;
        Node* prev;
        element_type data;
    };
    Node* head;
    Node* tail;
    unsigned int numElements;

我的 pop_back() 函数来自链表的公共部分:

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

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

4

1 回答 1

2

尽管该功能不会同时删除两个节点,但该功能是错误的。当列表为空时,它不检查是否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--;
    }
}
于 2016-12-08T01:23:15.670 回答