当前位置: 首页 > news >正文

单链表删除算法(p=L; j=0;与p=p->next;j=1的辨析)

 

 算法描述

Status ListDelete(LinkList &L,int i)
{
//在带头结点的单链表 L 中,删除第 i 个元素
p=L;  j=0;
while ((p->next) && (j<i-1))  
       {p=p->next;  ++j;}
if (!(p->next)||(j>i-1))  return ERROR;
q=p->next;
p->next=q->next;
delete q;
return OK;   
}

在带头结点的单链表中删除第i个元素时,正确的初始化方式是 p = L; j = 0;。原因如下:


关键逻辑

  1. 头结点不存储数据
    头结点 L 是虚拟节点,真正的数据从 L->next 开始。要删除第 i 个元素,需找到它的前驱节点(即第 i-1 个节点)。

  2. 循环条件的作用
    while (p->next && j < i-1) 的目的是让指针 p 移动到第 i-1 个节点。

    • j 从 0 开始计数,每移动一次 pj 自增,最终 j = i-1 时停止。
    • 如果 p->next 为空,说明链表长度不足,无法删除第 i 个元素。
  3. 为什么 p = L; j = 0 正确?

    • 初始时 p 指向头结点 Lj = 0 表示当前处于第 0 个位置(头结点)。
    • 循环结束后,p 指向第 i-1 个节点,此时 p->next 就是待删除的第 i 个节点。
    • 例子:删除第 1 个元素(i=1)时,循环不执行,p 仍指向头结点 L,直接操作 p->next 即可。

错误写法分析

如果初始化时写 p = p->next; j = 1(假设 p 已指向 L):

  1. 指针 p 直接跳过头结点,指向第一个数据节点,j 初始化为 1
  2. 问题
    • 无法处理 i=1 的情况(需要头结点 L 作为前驱)。
    • 当 i=1 时,j 初始为 1,循环条件 j < 0 不成立,直接判断 p->next,但此时 p 指向第一个数据节点,无法正确删除自身。

总结

  • 正确初始化p = L; j = 0
    从头结点开始遍历,确保能处理所有合法位置(包括 i=1)。
  • 错误写法p = L->next; j = 1
    跳过了头结点,导致无法正确删除第一个元素。

代码正确性验证:

cpp复制代码

p = L;    // p 指向头结点
j = 0;    // 当前处于第 0 个位置
while (p->next && j < i-1) {  // 移动 i-1 次
    p = p->next;
    j++;
}
if (!p->next || j > i-1) return ERROR;  // 位置非法
q = p->next;         // q 指向待删除节点
p->next = q->next;   // 绕过 q
delete q;             // 删除节点
http://www.dtcms.com/a/36719.html

相关文章:

  • Flutter系列教程之(3)——简单的APP实现
  • qtcreator上使用opencv报错
  • 水利工程安全包括哪几个方面
  • MacOS 终端选型
  • 实现分布式限流开源项目
  • 服务器硬件老化导致性能下降的排查与优化
  • 如何基于PyTorch做二次开发
  • 大白话React第六章深入学习 React 高级特性及生态
  • GGUF 文件格式全解析
  • 问题:undefined reference to `pthread_mutexattr_init‘
  • Vue的父子组件通信问题
  • vsCode下载、安装、推荐插件
  • 90.奇妙货币交易问题|Marscode AI刷题
  • 在Linux、Windows和macOS上部署DeepSeek模型的最低配置要求
  • 大白话3Vuex 是什么,具体怎么用?
  • 349. 两个数组的交集
  • django:更新页面但未生效
  • 基于JavaWeb开发的高校食堂点餐系统
  • 国内访问Github的四种方法(2025版)
  • 【YOLOv3】 源码总体结构分析
  • Linux部署dnsmasq软件
  • 【前端】【面试】【功能函数】写一个JavaScript树形结构操作函数:`filter` 与 `forEach`
  • C++ QT 6.6.1 QCustomPlot的导入及使用注意事项和示例 | 关于高版本QT使用QCustomPlot报错问题解决的办法
  • vue+element ui 实现选择季度组件
  • Linux(CentOS)安装 Nginx
  • java23种设计模式-命令模式
  • 安全性质量属性场景
  • 策略模式结合SpringBoot
  • 银行信贷业务解析:运营与数据双视角下的业务本质与技术支撑
  • C#连接sql server