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

news/2025/2/26 10:09:56

 

 算法描述

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.niftyadmin.cn/n/5868528.html

相关文章

【Docker基础】理解 Docker:本质、性质、架构与核心组件

文章目录 Docker 本质Docker 的引擎迭代Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高&#xff0c;速度快&#xff1f;Docker 和 JVM 虚拟化的区别Docker 版本1. LXC (Linux Containers)2. libcontainer3. Moby4. docker-ce5. docker-ee总结&#xff1a; Docker 架构…

DeepSeek个人知识库

deepseek构建个人知识库 安装软件链接 : 安装链接 先在本地把deepseek跑起来&#xff0c;本地部署deepseek见前文链接: 本地部署ollama # 目前软件只支持1.5b小模型&#xff0c;将就着用 ollama run deepseek-r1:1.5b等服务器启动后开启软件 上传文件 输入消息 &#xff08…

结构型模式 - 外观模式 (Facade)

结构型模式 - 外观模式 (Facade) 又名门面模式,通过为多个子系统提供一个一致的接口,使得子系统使用起来更加容易. 外观模式是“迪米特法则”的典型应用. // CPU 类&#xff0c;代表 CPU 子系统 class CPU {public void start() {System.out.println("CPU 启动");}p…

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件&#xff08;推荐、更容易&#xff09;4.2 加载.Safetensors文件&#xff08;不建议使用&#xff09; 5.配置大模型文件 参考&#xff1a; 1、 如…

文件下载技术的终极选择:`<a>` 标签 vs File Saver.js

文件下载技术的终极选择&#xff1a;<a> 标签 vs File Saver.js 在 Web 开发中&#xff0c;文件下载看似简单&#xff0c;实则暗藏玄机。工作种常纠结于 <a> 标签的原生下载和 File Saver.js 等插件的灵活控制之间。本文将从原理、优缺点、场景对比到实战技巧&…

【Elasticsearch】script_fields 和 runtime_fields的区别

script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能&#xff0c;但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比&#xff1a; 1.定义和应用场景 • script_fields&#xff1a; • 定义&#xff1a;通过 Painless 脚本…

蓝桥杯 Java B 组之记忆化搜索(滑雪问题、斐波那契数列)

Day 5&#xff1a;记忆化搜索&#xff08;滑雪问题、斐波那契数列&#xff09; &#x1f4d6; 一、记忆化搜索简介 记忆化搜索&#xff08;Memoization&#xff09; 是一种优化递归的方法&#xff0c;它利用 哈希表&#xff08;HashMap&#xff09;或数组 存储已经计算过的结果…

架构思维:架构的演进之路

文章目录 引言为什么架构思维如此重要架构师的特点软件架构的知识体系如何提升架构思维大型互联网系统架构的演进之路一、大型互联网系统的特点二、系统处理能力提升的两种途径三、大型互联网系统架构演化过程四、总结 引言 在软件开发行业中&#xff0c;有很多技术人可能会问…