You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++链表如何删除尾节点?现有代码问题求助

C++链表删除尾节点的正确实现

先看你现有代码的问题:

  • 你写的temp->next->next;//!=NULL只是个无效表达式,没有执行任何判断或遍历逻辑,根本没法定位到倒数第二个节点
  • 直接delete temp删掉的是中间节点(你的例子里是值为15的节点),还会让链表断链,原来的尾节点(值为20)还留在内存里造成泄漏,输出时还会出现异常

正确删除尾节点的步骤

分三种情况处理:

  1. 链表为空:如果head == NULL,直接返回,无需操作
  2. 链表只有一个节点:如果head->next == NULL,删除head后把head置为NULL
  3. 链表有多个节点:遍历到倒数第二个节点(即该节点的next->next为NULL),然后:
    • 用临时变量保存尾节点
    • 将倒数第二个节点的next设为NULL,断开链接
    • 删除尾节点释放内存

修正后的完整代码

#include<iostream>
using namespace std;

struct age{
    int a;
    age *next;
};

age *head,*current;

int main(){
    // 创建第一个节点
    age *node1=new age();
    head=node1;
    node1->a=10;
    
    // 创建第二个节点
    age *node2=new age();
    node2->a=20;
    node1->next=node2;
    node2->next=NULL;
    
    // 在node1和node2之间插入ona节点
    age *ona=new age;
    ona->a=15;
    ona->next=node1->next;
    node1->next=ona;
    
    // 删除尾节点的正确逻辑
    if (head == NULL) {
        cout << "链表为空,无节点可删" << endl;
    } else if (head->next == NULL) {
        delete head;
        head = NULL;
    } else {
        age* temp = head;
        // 遍历到倒数第二个节点
        while (temp->next->next != NULL) {
            temp = temp->next;
        }
        // 保存尾节点
        age* tail = temp->next;
        // 断开倒数第二个节点和尾节点的链接
        temp->next = NULL;
        // 删除尾节点
        delete tail;
    }
    
    // 输出链表内容
    current=head;
    while(current!=NULL){
        cout<<current->a<<endl;
        current=current->next;
    }
    
    return 0;
}

代码说明

  • 去掉了全局变量里多余的node1、node2、ona,这些变量定义为main内的局部变量更合理
  • 删除逻辑里的while (temp->next->next != NULL)会精准定位到倒数第二个节点,确保后续操作正确
  • 用tail保存尾节点,避免删除后找不到要释放的内存,同时断开链表链接,保证遍历输出时不会出错

内容的提问来源于stack exchange,提问作者willy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:45:25