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

灵感设计网站网站营销最大的特点

灵感设计网站,网站营销最大的特点,湛江专业建网站哪家好,无尺码精品产品文章目录LeetCode 19: 删除链表的倒数第 N 个结点🎯 问题描述示例约束条件🧠 算法思路分析方法一:两趟扫描(朴素解法)方法二:双指针一趟扫描(最优雅解法) ⭐🎨 双指针解法…

文章目录

  • LeetCode 19: 删除链表的倒数第 N 个结点
    • 🎯 问题描述
      • 示例
      • 约束条件
    • 🧠 算法思路分析
      • 方法一:两趟扫描(朴素解法)
      • 方法二:双指针一趟扫描(最优雅解法) ⭐
    • 🎨 双指针解法详解
      • 可视化演示
      • 关键点解析
        • 1. 为什么使用哑节点?
        • 2. 为什么快指针要先走 n+1 步?
        • 3. 删除操作的巧妙之处
    • 💻 完整代码实现
    • 📊 复杂度分析
      • 时间复杂度:O(L)
      • 空间复杂度:O(1)
    • 🧪 测试用例验证
      • 测试用例 1:常规情况
      • 测试用例 2:删除唯一节点
      • 测试用例 3:删除尾节点
      • 测试用例 4:删除头节点
    • 🎯 算法优势
      • 相比两趟扫描的优势:
      • 双指针技巧的通用性:
    • 🔧 实现细节和注意点
      • 1. 边界情况处理
      • 2. 指针移动的精确控制
      • 3. 安全的节点删除
    • 📈 扩展思考
      • 变种题目:
      • 相关算法模式:
    • 🎉 总结

LeetCode 19: 删除链表的倒数第 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

🧠 算法思路分析

方法一:两趟扫描(朴素解法)

思路:

  1. 第一趟遍历:计算链表长度 L
  2. 第二趟遍历:找到第 (L-n) 个节点,删除其后继节点

代码示例:

public ListNode removeNthFromEnd(ListNode head, int n) {// 第一趟:计算长度int length = 0;ListNode current = head;while (current != null) {length++;current = current.next;}// 第二趟:找到待删除节点的前驱ListNode dummy = new ListNode(0);dummy.next = head;current = dummy;for (int i = 0; i < length - n; i++) {current = current.next;}current.next = current.next.next;return dummy.next;
}

复杂度分析:

  • 时间复杂度:O(L),需要两趟遍历
  • 空间复杂度:O(1)

方法二:双指针一趟扫描(最优雅解法) ⭐

核心思想:
使用快慢双指针,快指针先走 n+1 步,然后快慢指针同时移动,当快指针到达末尾时,慢指针正好指向待删除节点的前驱。

算法步骤:

  1. 创建哑节点:简化边界情况处理
  2. 快指针先行:快指针比慢指针先走 n+1 步
  3. 同步移动:快慢指针同时向前移动
  4. 执行删除:当快指针到达末尾,删除慢指针的下一个节点

🎨 双指针解法详解

可视化演示

head = [1,2,3,4,5], n = 2 为例:

初始状态:
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null↑       ↑
slow    fast快指针先走 n+1 = 3 步:
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null↑                 ↑
slow              fast快慢指针同步移动,直到 fast 为 null:
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null↑               ↑slow           fast此时 slow.next 就是倒数第 2 个节点(节点4),删除它:
dummy -> 1 -> 2 -> 3 -----> 5 -> null↑slow

关键点解析

1. 为什么使用哑节点?
ListNode dummy = new ListNode(0);
dummy.next = head;
  • 统一处理:避免删除头节点时的特殊处理
  • 简化逻辑:始终可以通过 slow.next = slow.next.next 删除节点
2. 为什么快指针要先走 n+1 步?
for (int i = 0; i <= n; i++) {fast = fast.next;
}
  • 目标:让慢指针指向待删除节点的前驱
  • 如果快指针先走 n 步,慢指针会指向待删除节点本身
  • 先走 n+1 步,慢指针才能指向前驱节点
3. 删除操作的巧妙之处
slow.next = slow.next.next;
  • 直接跳过待删除节点
  • 简洁且高效

💻 完整代码实现

/*** 删除链表的倒数第 n 个结点 - 双指针一趟扫描解法*/
public ListNode removeNthFromEnd(ListNode head, int n) {// 创建哑节点,简化边界情况的处理ListNode dummy=new ListNode(0,head);// 双指针:fast 和 slowListNode slow=dummy;ListNode fast=dummy.next;// 快指针先移动 n+1 步for (int i = 0; i < n; i++) {fast=fast.next;}// 快慢指针同时移动,直到快指针到达末尾while (fast != null) {fast=fast.next;slow=slow.next;}// 删除倒数第 n 个节点slow.next=slow.next.next;return dummy.next;
}

📊 复杂度分析

时间复杂度:O(L)

  • L 是链表的长度
  • 只需要一趟遍历,快指针最多移动 L 步

空间复杂度:O(1)

  • 只使用了常数个额外指针
  • 不依赖于输入规模

🧪 测试用例验证

测试用例 1:常规情况

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
解释:删除倒数第2个节点(值为4的节点)

测试用例 2:删除唯一节点

输入:head = [1], n = 1
输出:[]
解释:删除唯一节点,链表变为空

测试用例 3:删除尾节点

输入:head = [1,2], n = 1
输出:[1]
解释:删除最后一个节点

测试用例 4:删除头节点

输入:head = [1,2], n = 2
输出:[2]
解释:删除第一个节点(倒数第2个)

🎯 算法优势

相比两趟扫描的优势:

  1. 效率更高:只需一趟遍历
  2. 空间友好:常数空间复杂度
  3. 代码简洁:逻辑清晰,易于理解
  4. 边界处理:哑节点技巧优雅处理特殊情况

双指针技巧的通用性:

  • 链表倒数第k个节点
  • 链表中点查找
  • 环形链表检测
  • 链表相交检测

🔧 实现细节和注意点

1. 边界情况处理

// 使用哑节点统一处理删除头节点的情况
ListNode dummy = new ListNode(0);
dummy.next = head;

2. 指针移动的精确控制

// 精确控制快指针的初始位置
for (int i = 0; i <= n; i++) {fast = fast.next;
}

3. 安全的节点删除

// 确保 slow 指向待删除节点的前驱
slow.next = slow.next.next;

📈 扩展思考

变种题目:

  1. 删除链表正数第n个节点:直接遍历即可
  2. 删除链表倒数第k个到第1个节点:双指针+多次删除
  3. 找到倒数第n个节点但不删除:双指针找到即可

相关算法模式:

  • 快慢指针:解决链表相关问题的经典技巧
  • 哑节点:简化链表操作的常用手法
  • 一趟遍历:提高算法效率的重要思想

🎉 总结

这道题展示了双指针技巧在链表问题中的强大威力。通过巧妙地控制两个指针的相对位置,我们能够在一趟遍历中解决原本需要两趟遍历的问题。这种思想在很多链表算法中都有应用,是非常值得掌握的经典技巧。

关键要点:

  • 🎯 双指针一趟扫描是最优雅的解法
  • 🛡️ 哑节点简化边界情况处理
  • ⚡ 时间复杂度 O(L),空间复杂度 O(1)
  • 🧩 快指针先走 n+1 步是关键
  • 🎨 算法思想可推广到其他链表问题
http://www.dtcms.com/a/591669.html

相关文章:

  • 免费行情软件app网站红色网站优化怎么弄
  • 泉州住房和城乡建设部网站网站建设黄页免费在线观看
  • 做二手房需要用到哪些网站搜集房源网页设计重庆
  • 阿里云网站建设详细教程台州网站设计
  • 海南网站建设报价方案自己的身份已经网站备案了
  • 怎么能查到网站是哪个公司做的wordpress游戏充值
  • 新服务器做网站wordpress 支付宝个人
  • 做个静态网站多少钱dede 网站名称不显示
  • 免费的seo网站下载阿里云怎么申请域名
  • qq引流推广软件哪个好专业网站优化电话
  • 福建省建设干部网站建筑方案设计
  • 做网站需要租服务器么赣州做网站的公司
  • 分类信息网站怎么做网站开发软件有哪些免费
  • 重庆那些网站知页怎么转换wordpress
  • 担路网如何快速做网站ppt在线制作
  • 自适应网站的缺点做网站用linux哪个版本
  • a站播放量最高的视频泰安人才网app
  • 怎么做网站评论数字校园建设专题网站
  • 网站全站开发需要学什么投票小程序
  • 做网站的公司重庆智慧团建官网手机版
  • 合肥建设管理学校网站首页wordpress 评分
  • 济南做网站比较好的公司有哪些html5网站后台模板
  • 哪个网站可以做付邮免费送活动深圳网络营销和推广渠道
  • 温州网站建设公司公司哪家好天津建网站的公司
  • 网站备案要啥开发公司组织员工办按揭
  • 网站的总体方案与功能设计企业官网策划
  • 网站注册怎么做装饰网站建设优惠套餐
  • 电商网站首页可以免费生成网站的软件
  • 网站打不开 ...大丰企业做网站多少钱
  • 阿里云备案网站负责人网络营销有哪些理论和方法