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

设计一个算法:删除非空单链表L中结点值为x的第一个结点的前驱结点

目录

单链表的存储结构定义如下

快慢指针法

三指针法版本①

三指针法版本② 


单链表的存储结构定义如下

typedef struct{Elemtype data;struct Node* next;
}LNode,*LinkList;

快慢指针法

void deleteprex(LinkList L, Elemtype e) {if (L == NULL || L->next == NULL || L->next->next == NULL) {return;  // 链表为空、只有一个节点或两个节点,无法删除前驱节点}LinkList q = L;        // 慢指针,指向当前节点的前驱LinkList p = L->next;  // 快指针,用于查找值为e的节点// 检查第一个数据节点是否是目标节点(此时没有前驱节点)if (p->data == e) {return;  // 无法删除前驱节点,直接返回}// 从第二个数据节点开始遍历p = p->next;  // p指向第二个数据节点while (p != NULL) {if (p->data == e) {// 找到值为e的节点,删除其前驱节点(即q的下一个节点)LinkList temp = q->next;q->next = p;free(temp);return;  // 只删除第一个出现的节点的前驱,处理完后立即返回}// 未找到,指针后移q = q->next;p = p->next;}
}

三指针法版本①

int DelNodeX_L(LinkList &L, ElemType x) {// 初始化指针:prepre 指向头结点,pre 指向第二个结点,p 待初始化LinkList prepre = L, pre = prepre->next, p;  // 若第二个结点值就是 x,无有效前驱可删,返回失败if (pre->data == x)  return 0;  // p 指向第三个结点,开始遍历找值为 x 的结点p = pre->next;  while (p != NULL && p->data != x) {  // 指针后移:prepre → pre → pprepre = pre;  pre = p;  p = p->next;  }  // 找到值为 x 的结点(p 非空),删除其前驱(pre)if (p != NULL) {  // prepre 跳过 pre,直接指向 pprepre->next = p;  // 释放前驱结点内存free(pre);  // 返回删除成功return 1;  } else {  // 未找到值为 x 的结点,返回失败return 0;  }  
}

三指针法版本②

void deleteprex(LinkList L, Elemtype e) {if (L == NULL || L->next == NULL || L->next->next == NULL) {return;  // 链表为空、只有一个节点或两个节点,不可能存在前驱节点}LinkList pre = L;        // 前驱节点的前驱(用于删除操作)LinkList cur = L->next;  // 当前节点,用于查找值为e的节点// 检查第一个数据节点是否是目标节点(此时没有前驱节点)if (cur->data == e) {return;  // 无法删除前驱节点,直接返回}// 从第二个数据节点开始遍历LinkList next = cur->next;while (next != NULL) {if (next->data == e) {// 找到值为e的节点,删除其前驱节点(即cur)pre->next = next;free(cur);return;  // 只删除第一个出现的节点的前驱,处理完后立即返回}// 未找到,指针后移pre = cur;cur = next;next = next->next;}
}

http://www.dtcms.com/a/237455.html

相关文章:

  • 【LLM】fast-api 流式生成测试
  • 计算机是如何⼯作的
  • Day15
  • 长期施肥下红壤温湿度及电导率数据集
  • 【HarmonyOS 5】运动健康开发实践介绍以及详细案例
  • 篇章十 数据结构——Java对象的比较
  • 【Linux庖丁解牛】—系统文件I/O !
  • springCloud2025+springBoot3.5.0+Nacos集成redis从nacos拉配置起服务
  • 基于Java Swing的办公自动化系统设计与实现:附完整源码与论文
  • 创建一个纯直线组成的字体库
  • DenseNet算法 实现乳腺癌识别
  • 算法练习-回溯
  • 【题解-洛谷】P10448 组合型枚举
  • 学而思网校发布AI编程新品,四重升级培育未来创新人才
  • Vue 中 v-show 与 v-if 的深度对比与性能分析
  • 第二十六章 流程控制: case分支
  • 乐观锁与悲观锁的实现和应用
  • Java 泛型技术详解
  • 【判断既约分数】2022-4-3
  • JDK21深度解密 Day 13:性能调优实战案例:高并发系统与内存密集型应用的优化秘籍
  • 【数据结构初阶】--算法复杂度的深度解析
  • Linux编程:2、进程基础知识
  • 后端下载限速(redis记录实时并发,bucket4j动态限速)
  • 如何在 Java 中优雅地使用 Redisson 实现分布式锁
  • 【Redis系列 04】Redis高可用架构实战:主从复制与哨兵模式从零到生产
  • 在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制
  • [逆向工程] C实现过程调试与钩子安装(二十七)
  • win10环境配置-openpose pytorch版本
  • 【Hugging Face】实践笔记:Pipeline任务、BERT嵌入层、Train任务、WandB解析
  • 编程基础:执行流