当前位置: 首页 > 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;             // 删除节点

相关文章:

  • 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】 源码总体结构分析
  • 人力招聘网站建设目的/网站网络推广优化
  • 给别人做网站挣钱吗/参考消息网国内新闻
  • 做it的中国企业网站/关键词搜索工具爱站网
  • 宜春做网站的联系电话/好用吗
  • 政府网站建设预算10万/100个成功营销案例
  • 网站建设实训主要收获及体会/ seo won