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

【算法面试必刷】19. 删除链表的倒数第 N 个结点

目录

题目

题目链接

思路

复杂度

代码


题目

题目链接

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&envId=top-100-liked

思路

  1. 统计链表长度
    通过一次遍历,计算出链表的总节点数cnt

  2. 计算正数位置
    倒数第n个节点的前一个节点,其正数位置为cnt - n(从1开始计数)。
    例如:链表长度为5,要删除倒数第2个节点,则前一个节点是正数第3个节点。

  3. 处理特殊情况
    如果cnt - n == 0,说明要删除的是头节点,直接返回head->next

  4. 再次遍历找到前一个节点
    重新遍历链表,找到第cnt - n个节点,将它的next指针指向下下个节点,从而跳过要删除的节点。

  5. 返回头节点
    如果头节点被删除,已提前返回新头;否则返回原头节点。

复杂度

  • 时间复杂度:O(n)
    需要两次遍历链表,每次遍历 O(n),总操作次数约为 2n,仍属于线性时间复杂度。

  • 空间复杂度:O(1)
    只使用了常数个额外指针变量,不依赖链表长度。

代码

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { // 第一次遍历:统计链表长度 int cnt = 0; // 记录节点总数 ListNode* cur = head; // 临时指针用于遍历 while (cur != nullptr) { cnt++; cur = cur->next; } // 计算要删除的节点的前一个节点的正数位置 // 倒数第 n 个节点的前一个节点是正数第 (cnt - n) 个节点(从1开始计数) cnt = cnt - n; // 如果要删除的是头节点(即 cnt == 0),直接返回 head->next if (cnt == 0) { return head->next; } // 第二次遍历:找到第 cnt 个节点 cur = head; // 重新指向头节点 int curcnt = 0; // 记录当前遍历到的节点位置 while (cur != nullptr) { curcnt++; // 先递增,此时 cur 指向第 curcnt 个节点 if (curcnt == cnt) { // 当到达第 cnt 个节点时 // 删除它的下一个节点(即倒数第 n 个节点) cur->next = cur->next->next; break; // 删除后可以提前退出循环 } cur = cur->next; // 继续向后移动 } // 返回原头节点(注意:如果删除的是头节点,上面已返回新头) return head; } };
http://www.jsqmd.com/news/464676/

相关文章:

  • 如何选择正确的天线
  • PP-DocLayoutV3企业级应用:与Dify平台集成构建智能文档处理工作流
  • 从手机到安防:拆解MIPI-CSI2协议在Hi3518E摄像头开发中的特殊优化
  • Spring 中的 FactoryBean
  • AthenaX开发者指南:从源码构建到自定义连接器开发
  • 【后端】Docker一本通
  • 多控智能小车:嵌入式模块化设计与多模通信架构
  • 从源码到实践:sd-dynamic-thresholding核心算法Dynthresh类深度剖析
  • Awesome React Hooks生态系统:最值得推荐的15个第三方钩子库
  • ZCU106开发板上Aurora 64B66B IP核的硬件调试实战(含SMA接线指南)
  • Vue 中 data 为什么是函数而不是对象?
  • Tooll 3 开源项目推荐:实时运动图形创作的革命性工具
  • MuJoCo Playground 项目复现与问题记录
  • ntc-templates高级技巧:提升网络自动化效率的7个方法
  • 从PTA最佳调度问题看回溯法的实战应用:避坑指南与性能优化
  • T536 4G模块适配
  • Fider 开源项目推荐:构建现代化用户反馈平台的最佳实践
  • 知网和维普AIGC检测哪个更严?同一篇论文双平台实测数据
  • FreeFileSync批量同步教程:轻松管理多文件夹同步任务
  • reid 行人跟踪源代码
  • Rust 的 mod(模块) 说明
  • Alibaba Cloud 实现大文件上传
  • 把 SAP 系统真正跑在 IPv6 上:从实例开关到 AS Java、DNS 与双栈治理的完整实践
  • IDEA使用指南GUIDE
  • 消息队列原理篇
  • PyCharm连接英伟达4090D GPU服务器实战(本文提供项目代码、英伟达4090D显卡服务器完整环境)
  • SpeedAI、笔灵AI、嘎嘎降AI三款热门工具实测,谁才是性价比之王
  • 10个Kinesalite常见问题解决方案:从安装到数据处理全指南
  • 【Python】算法笔记
  • 率零和去AIGC哪个好用?两款平价降AI工具深度对比