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

LeetCode - 19.删除链表的倒数第N个结点

目录

题目

解法一

双指针算法

核心思想

执行流程

具体例子

代码

解法二

两次遍历法

核心思想

执行流程

具体例子

代码


题目

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

解法一

双指针算法

核心思想

利用双指针间隔固定距离(n+1),当快指针到达链表末尾时,慢指针恰好位于倒数第n个节点的前一位置。

执行流程

  1. 创建哑节点dummy,指向链表头部
  2. 初始化快指针fast和慢指针slow,都指向dummy
  3. fast先前进n+1步
  4. fast和slow同时前进,直到fast到达NULL
  5. slow此时指向待删除节点的前一节点,执行删除操作
  6. 返回dummy->next作为新的头节点

具体例子

对于链表1→2→3→4→5,删除倒数第2个节点(n=2):

  1. 创建dummy→1→2→3→4→5
  2. fast和slow初始都指向dummy
  3. fast前进3步(n+1):fast指向3
  4. fast和slow同时前进:
  5. 当fast到达5后的NULL
  6. slow指向3
  7. 删除slow->next(即4):3→5
  8. 返回dummy->next:1→2→3→5

代码

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy = new ListNode(0);dummy->next = head;ListNode* fast = dummy;ListNode* slow = dummy;for(int i = 0; i<n+1; i++){if(!fast){return head;}fast = fast->next;}while(fast){fast = fast->next;slow = slow->next;}if(slow->next){ListNode* toDelete = slow->next;slow->next = slow->next->next;delete toDelete;}ListNode* newhead = dummy->next;delete dummy;return newhead;}
};

解法二

两次遍历法

核心思想

执行流程

  1. 创建哑节点dummy,指向链表头部
  2. 第一次遍历计算链表长度length
  3. 计算待删除节点的正序位置:position = length - n
  4. 第二次遍历,前进position步找到待删除节点的前驱
  5. 删除目标节点
  6. 返回dummy->next作为新的头节点

具体例子

对于链表1→2→3→4→5,删除倒数第2个节点(n=2):

  1. 创建dummy→1→2→3→4→5
  2. 计算链表长度length = 5
  3. 找到正序位置:position = 5 - 2 = 3
  4. 从dummy开始前进3步到达节点3
  5. 删除节点3的下一个节点(4):3→5
  6. 返回dummy->next:1→2→3→5

双指针法效率更高,因为只需一次遍历;两次遍历法思路更直观,易于理解。

代码

ListNode* removeNthFromEnd(ListNode* head, int n) {// 创建哑节点ListNode* dummy = new ListNode(0);dummy->next = head;// 第一次遍历计算链表长度int length = 0;ListNode* first = head;while (first) {length++;first = first->next;}// 计算要删除节点的位置int position = length - n;// 找到待删除节点的前一个节点ListNode* curr = dummy;for (int i = 0; i < position; i++) {curr = curr->next;}// 删除节点并释放内存ListNode* toDelete = curr->next;curr->next = curr->next->next;delete toDelete;// 获取新的头节点head = dummy->next;delete dummy;return head;
}

http://www.xdnf.cn/news/3600.html

相关文章:

  • 探索 C++23 std::to_underlying:枚举底层值获取的利器
  • 单片机嵌入式字符流数据解析库
  • YOLOv11改进:利用RT-DETR主干网络PPHGNetV2助力轻量化目标检测
  • AVFormatContext 再分析二
  • (即插即用模块-Attention部分) 六十三、(2024 CVPR) MLKA 多尺度大核注意力
  • 计算机视觉与深度学习 | 什么是图像金字塔?
  • 如何用CSS实现HTML元素的旋转效果:从基础到高阶应用
  • SQL ROUND() 函数详解
  • MySQL基础关键_006_DQL(五)
  • 数智图书馆的信息组织革命:AI变革下的新秩序
  • Spring 事务的底层原理常见陷阱
  • Fabrice Bellard(个人网站:‌bellard.org‌)介绍
  • ad 多通道设计中出现的相关问题
  • AWS上构建基于自然语言和LINDO API的线性规划与非线性规划的优化计算系统
  • MCP 探索:MCP 集成的相关网站 Smithery、PulseMCP 等
  • Java面试趣事:从死循环到分段锁
  • Lua 基础 API与 辅助库函数 中关于创建的方法用法
  • 基于STM32的智能摇头风扇设计(WIFI+语音控制)
  • CGAL:最小包围圆
  • 共铸价值:RWA 联合曲线价值模型,撬动现实资产生态
  • 基于机器学习的心脏病数据分析与可视化(百度智能云千帆AI+DeepSeek人工智能+机器学习)健康预测、风险评估与数据可视化 健康管理平台 数据分析与处理
  • k8s 探针
  • 基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位
  • 基于「骑手外卖系统」串联7大设计原则
  • 【Hot 100】 146. LRU 缓存
  • Three.js在vue中的使用(二)-加载、控制
  • 【ICMP协议深度解析】从网络诊断到安全实践
  • Mysql常用语句汇总
  • centos7.0无法安装php8.2/8.3
  • ROS2学习笔记|创建工作空间并打印文件内容