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

C++链表中删除第n个位置节点问题:末尾节点无法删除

问题分析与解决方案

首先直接回答你的疑问:你的猜测方向有偏差,核心问题不是末尾节点缺少后续节点导致的,而是你的Delete函数代码逻辑存在严重错误——不过话说回来,正确的逻辑下,末尾节点的删除其实不需要额外的特殊处理,咱们来一步步说清楚:

你的Delete函数到底错在哪?

看你原来的Delete函数代码:

void Delete(int n) {
 struct Node* temp1 = head;
 if(n == 1) {
  head = temp1->next;
  free(temp1);
  return;
 }
 int i;
 for(i = 0; i<n-2; i++) {
  temp1 = temp1->next;
  struct Node* temp2 = temp1->next;
  temp1->next = temp2->next;
  free(temp2);
 }
}

这里的致命错误是:你把删除节点的核心操作(定位要删的节点、修改指针、释放内存)放在了for循环的内部。这意味着每循环一次,你就会删除一个节点,而不是只删除指定位置的节点。

举个例子,当你输入n=4(要删除第4个节点)时:

  1. n-2=2,循环会执行2次
  2. 第一次循环:temp1从head(节点2)移动到节点4,然后删除节点6——这时候链表已经变成2->4->5了
  3. 第二次循环:temp1移动到节点5,此时temp2 = temp1->next是NULL,你试图访问temp2->next(也就是NULL->next),这直接触发了空指针访问,导致程序崩溃无响应。

修正后的Delete函数逻辑

正确的删除节点逻辑应该是:

  1. 先定位到要删除节点的前一个节点(第n-1个节点)
  2. 找到要删除的节点(前一个节点的next)
  3. 把前一个节点的next指向要删除节点的next(如果要删除的是末尾节点,它的next本来就是NULL,刚好让前一个节点的next变成NULL,完美处理末尾情况)
  4. 释放要删除节点的内存

同时还要加个边界判断,防止输入的n超过链表长度导致空指针访问。修正后的代码如下:

void Delete(int n) {
 struct Node* temp1 = head;
 // 删除头节点的情况
 if(n == 1) {
  head = temp1->next;
  free(temp1);
  return;
 }
 // 移动到第n-1个节点
 for(int i = 0; i < n-2; i++) {
  temp1 = temp1->next;
  // 如果中途temp1变成NULL,说明n超过了链表长度
  if(temp1 == NULL) {
      printf("Invalid position! Position exceeds list length.\n");
      return;
  }
 }
 struct Node* temp2 = temp1->next;
 // 如果temp2是NULL,说明n是无效位置
 if(temp2 == NULL) {
     printf("Invalid position! Position exceeds list length.\n");
     return;
 }
 // 修改指针,不管temp2是不是末尾节点都适用
 temp1->next = temp2->next;
 free(temp2);
}

测试验证

当你输入n=4时:

  • 原始链表是2->4->6->5
  • 循环结束后temp1指向第3个节点(6)
  • temp2指向第4个节点(5)
  • temp1->next = temp2->next也就是把6的next设为NULL
  • 释放节点5的内存
  • 最终链表变成2->4->6,完全符合你的预期输出。

回到你的疑问

你担心“末尾节点之后不存在第n+1个节点,导致第n-1个节点无法指向该节点”——其实完全不需要担心,因为末尾节点的next本身就是NULL,把前一个节点的next指向这个NULL就刚好完成了末尾节点的删除,不需要额外的专门处理,只要你的代码逻辑正确就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:13:15