C++链表如何删除尾节点?现有代码问题求助
C++链表删除尾节点的正确实现
先看你现有代码的问题:
- 你写的
temp->next->next;//!=NULL只是个无效表达式,没有执行任何判断或遍历逻辑,根本没法定位到倒数第二个节点 - 直接
delete temp删掉的是中间节点(你的例子里是值为15的节点),还会让链表断链,原来的尾节点(值为20)还留在内存里造成泄漏,输出时还会出现异常
正确删除尾节点的步骤
分三种情况处理:
- 链表为空:如果
head == NULL,直接返回,无需操作 - 链表只有一个节点:如果
head->next == NULL,删除head后把head置为NULL - 链表有多个节点:遍历到倒数第二个节点(即该节点的
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
相关产品推荐
相关产品推荐

