当前位置: 首页 > 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.xdnf.cn/news/917425.html

相关文章:

  • 零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
  • 【20250607接单】Spark + Scala + IntelliJ 项目的开发环境配置从零教学
  • Spark 之 AQE
  • OneNet + openssl + MTLL
  • 科学选购儿童用品 | 了解增塑剂(尤其邻苯类)化学成分的来源与用途,为孩子多加一层健康防护。
  • 基于SpringBoot解决RabbitMQ消息丢失问题
  • Srping Cloud Gateway 跨域配置 CorsWebFilter
  • conda指定包安装的channel
  • Java编程之原型模式
  • 线性代数小述(二之前)
  • 什么是预训练?深入解读大模型AI的“高考集训”
  • 【Java学习笔记】SringBuffer类(重点)
  • 集运维_安装linux,麒麟等系统_步骤
  • 64、js 中require和import有何区别?
  • Docker镜像无法拉取问题解决办法
  • natapp 内网穿透失败
  • n8n + AI Agent:AI 自动化生成测试用例并支持导出 Excel
  • 基于 TAPD 进行项目管理
  • Linux(14)——库的制作与原理
  • 第18节 Node.js Web 模块
  • Node.js: express 使用 Open SSL
  • 腾讯开源视频生成工具 HunyuanVideo-Avatar,上传一张图+一段音频,就能让图中的人物、动物甚至虚拟角色“活”过来,开口说话、唱歌、演相声!
  • C++之STL--list
  • LeetCode 239. 滑动窗口最大值(单调队列)
  • 【Hot 100】295. 数据流的中位数
  • 客户端和服务器已成功建立 TCP 连接【输出解析】
  • Doris 数据库深度解析:架构、原理与实战应用
  • 5.4.2 Spring Boot整合Redis
  • Cisco Packer Tracer 综合实验
  • 网页绘制表格