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

C语言编程--16.删除链表的倒数第n个节点

题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2

输入:head = [1], n = 1
输出:[]
示例 3

输入:head = [1,2], n = 1
输出:[1]

提示

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
// 函数用于从单链表的末尾删除第 n 个节点,并返回新的链表头指针
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {// 用于遍历链表的指针,初始指向链表头struct ListNode* node = head;// 用于记录链表节点的数量int count = 0;   // 遍历链表,统计节点数量while (node) {node = node->next;count++;}// 如果要删除的节点是头节点(即链表长度等于 n)if (count == n) {// 保存原头节点的下一个节点struct ListNode* temp = head->next;// 将头指针指向下一个节点,相当于删除了原头节点head = head->next;// 返回新的头节点return head;}// 将指针重新指向链表头,准备再次遍历node = head;// 计算要删除节点的前一个节点的位置int m = count - n;// 遍历到要删除节点的前一个节点for (int i = 0; i < m - 1; i++)node = node->next;// 保存要删除的节点struct ListNode* temp = node->next;// 将前一个节点的 next 指针指向要删除节点的下一个节点,跳过要删除的节点node->next = node->next->next;  // 返回原链表的头节点(链表已被修改)return head;
}

代码分析:

优点

  1. 逻辑清晰:代码采用了先遍历一次链表统计节点数量,再根据数量计算要删除节点的位置,最后进行删除操作的思路,整体逻辑比较直观,容易理解。
  2. 处理头节点情况:通过判断链表长度和 n 的关系,专门处理了要删除的节点是头节点的情况,保证了代码的正确性。

缺点

  1. 两次遍历链表:代码中先对链表进行了一次遍历统计节点数量,然后又进行了一次遍历找到要删除节点的前一个节点。这种方式增加了时间复杂度,使得时间复杂度为 O(n),在一些对时间要求较高的场景下可能效率较低。
  2. 未释放内存:在删除节点时,保存了要删除的节点指针 temp,但没有释放该节点占用的内存,会导致内存泄漏问题。
  3. 边界条件处理不够完善:代码仅处理了要删除的节点是头节点的情况,对于其他一些特殊情况(例如空链表等)没有进行额外的处理,健壮性不足。
  4. 没有使用虚拟头节点:使用虚拟头节点可以简化链表操作,特别是在处理头节点删除等情况时,可以避免一些特殊情况的判断,使代码更加简洁和统一。但此代码没有采用这种方式。

为了改进这些缺点,可以考虑使用双指针法(快慢指针),只遍历一次链表就能找到要删除的节点,同时注意释放内存和完善边界条件的处理。

相关文章:

  • C# 结构(Struct)
  • 【“星睿O6”AI PC开发套件评测】开箱+刷机+基础环境配置
  • 在Ubuntu 18.04 和 ROS Melodic 上编译 UFOMap
  • 进入救援模式(物理服务器)
  • LeetCode238_除自身以外数组的乘积
  • untiy 实现点击按钮切换天空盒子
  • 手动实现legend 与 echarts图交互 通过js事件实现图标某项的高亮 显示与隐藏
  • Vivado22 Vcs18仿真联调原语缺失
  • DNS实验
  • STM32F407使用ESP8266实现阿里云OTA(中)
  • Python学习之路(五)-接口API
  • Java Thread类深度解析:构造方法与核心方法全攻略
  • 运算符重载 (Operator Overloading)
  • RPCRT4!NDRSContextUnmarshall2函数分析
  • IEEE综述 | 车道拓扑推理20年演进:从程序化建模到车载传感器
  • 什么是CMMI认证?CMMI评估内容?CMMI认证能带来哪些好处?
  • 通过4种方法来重置UOS操作系统中的用户密码
  • 4.3 工具调用与外部系统集成:API调用、MCP(模型上下文协议)、A2A、数据库查询与信息检索的实现
  • 简易学生成绩管理系统(C语言)
  • 动手试一试 Spring Security入门
  • 湃书单|澎湃新闻编辑们在读的19本书:在工作中迷失
  • 复旦大学校友夫妇一次性捐赠10亿元,成立学敏高等研究院
  • 美国那点事|特朗普的“刀”砍向国务院,美国霸权迎来历史拐点?
  • 国防部发布、中国军号及多家央媒官博发祝福海报:人民海军76岁生日快乐
  • 人民热评:大尺度色情语聊、撮合卖淫,社交APP岂止跑偏
  • 商务部:支持“来数加工”等新业态新模式,发展游戏出海业务