从单链表中删除最后一个节点

Posted

技术标签:

【中文标题】从单链表中删除最后一个节点【英文标题】:Delete last node from single-linked list 【发布时间】:2015-10-21 01:07:30 【问题描述】:

我必须编写一个从列表中删除最后一个节点的方法。你们对我应该如何处理这个问题有什么想法吗?

【问题讨论】:

我不懂c++,但逻辑如下-while(node->next) node = node->next;删除节点。 迭代到列表的末尾,保留指向列表中前一项的指针。将前一项的下一个指针设置为 NULL(或任何用于不再链接的内容)。释放最后一项。 列表中最后一个节点的 Node::next 字段应该是 nullptr。 如果我站在你的立场上,我会在互联网上搜索“c++ 删除节点链表”之类的内容。但既然我不是,你就只能受苦了。 如果您真的使用 C++ 而不是 C,则应该使用 STL 的 std::list(双链接)或 std::forward_list(单链接)容器。 【参考方案1】:

如果你有一个单链表,你别无选择,只能遍历整个链表到最后一个节点,保持一个指向前一个节点的指针,这样你就可以在释放最后一个节点时重置其next 字段:

if (head)

    node *curNode = head;
    node *prevNode = NULL;

    while (curNode->next)
    
        prevNode = curNode;
        curNode = curNode->next;
    

    if (prevNode) prevNode->next = NULL;
    delete curNode;

如果您使用的是双链表,这会更容易,因为您可以保留指向列表中最后一个节点的指针并直接对其进行操作:

if (head == tail)

    delete head;
    head = tail = NULL;

else if (tail)

    node *curNode = tail;
    tail = curNode->previous; 
    tail->next = NULL;
    delete curNode;

当然,如果您真的在使用 C++,那么您应该使用 STL 的 std::list(双链接)或 std::forward_list(单链接)容器,它们会为您处理这些细节。

【讨论】:

【参考方案2】:

要删除列表中的最后一个元素,您需要做的就是维护两个独立的节点。最初一个应该指向列表的头部,另一个应该指向列表中的第二个元素。您应该执行以下操作:

if(head == NULL)
     return 0;
else if(head->next == NULL)
     Node *temp = head;
     delete temp;
     head = NULL;

else
    Node *one = head;
    Node *two = head->next;
    while(two->next != NULL)
         two = two->next;
         one = one->next;
    
    one->next = NULL;
    delete two;

【讨论】:

如果列表有 2 个元素,对吗? (两个是最后一个元素)还是我弄错了? @BozhidarGrujoski 如果列表至少包含两个元素,则先前的答案可以正常工作,并且此编辑后的答案适用于任何长度的列表。 如果 head 以 NULL 开头则失败。 如果列表中只有1个节点,这也无法删除head节点。

以上是关于从单链表中删除最后一个节点的主要内容,如果未能解决你的问题,请参考以下文章

线性表练习之Example002-删除递增非空单链表中的重复值域节点

单链表和双链表中节点删除的时间复杂度

线性表练习之Example039-删除循环单链表中的所有最小值节点直至链表为空

无表头单链表的总结----从链表中删除某一个年纪的的节点

线性表练习之Example003-删除单链表最小值节点

2.2 在单链表和双链表中删除倒数第K个节点