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

server/2025/3/1 21:38:23/

 

 算法描述

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.ppmy.cn/server/171636.html

相关文章

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式&#xff1f;二、 为什么要用模板方法模式&#xff1f;三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&a…

vue写一个登录页面

目录 一、安装ui库二、路由跳转三、页面 一、安装ui库 element plus库 Element Plus 是 Element UI 的升级版本&#xff0c;专为 Vue 3.x 设计。它继承了 Element UI 的优秀特性&#xff0c;同时针对 Vue 3 的新特性&#xff08;如 Composition API、Teleport 等&#xff09;进…

HONOR荣耀MagicBook 15 2021款 独显(BOD-WXX9,BDR-WFH9HN)原厂Win10系统

适用型号&#xff1a;【BOD-WXX9】 MagicBook 15 2021款 i7 独显 MX450 16GB512GB (BDR-WFE9HN) MagicBook 15 2021款 i5 独显 MX450 16GB512GB (BDR-WFH9HN) MagicBook 15 2021款 i5 集显 16GB512GB (BDR-WFH9HN) 链接&#xff1a;https://pan.baidu.com/s/1S6L57ADS18fnJZ1…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区&#xff0c;使用前需先按Fn键 1.1、功能区 ESC&#xff1a;退出 F1&#xff1a;显示帮助信息 F2&#xff1a;重命名 F4&#xff1a;重复上一步操作 F5&#xff1a;刷新网页 …

C/C++语言知识点二

1. 编程算法之“哨兵”思想 哨兵思想是一种编程技巧&#xff0c;通过在数据结构的边界或特定位置放置一个特殊值&#xff08;称为“哨兵”&#xff09;&#xff0c;来简化逻辑判断和提高代码效率。哨兵通常是一个标记值&#xff0c;用于指示某种条件或边界&#xff0c;从而避免…

第9章 机器学习与统计模型

这一章重点探讨统计模型和机器学习模型&#xff0c;两个大的主题都建立在数据的基础之上&#xff0c;所以要熟练掌握对数据的处理与分析。实际上&#xff0c;机器学习本身就是统计模型的延伸&#xff0c;是在大数据背景下传统统计方法捉襟见肘了&#xff0c;所以才考虑引入机器…

Joycon-Robotics库的安装报错解决记录

Joycon-Robotics: Nintendo Switch Joy-Con for Robotics 今天遇到一个小bug&#xff0c;就算在安装joycon-robotic库的时候&#xff1a; cd joycon-robotic pip install -e . 上面这2行指令无误&#xff0c;但是&#xff1a; make install 这个指令报错&#xff0c;error如下…

通过Sidecar模式实现服务注册、服务发现和负载均衡的分布式系统架构

以下是通过Sidecar模式实现服务注册、服务发现和负载均衡的分布式系统架构的详细文字图示&#xff1a; ---------------------------------------------------------------------------------------- | 分布式系统架构示意图 …