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

LeetCode hot 100—删除链表的倒数第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]

分析

为了删除链表的倒数第 n 个结点,可以使用双指针法。具体思路是先让一个指针 fast 向前移动 n 步,然后再让另一个指针 slow 从链表头开始,与 fast 指针同时移动,当 fast 指针到达链表末尾时,slow 指针正好指向倒数第 n + 1 个结点,此时删除 slow 指针的下一个结点即可。

双指针法

时间复杂度:O(L), L 是链表的长度

空间复杂度:O(1)

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 创建一个虚拟头结点,方便处理删除头结点的情况
        ListNode* dummy = new ListNode(0, head);
        ListNode* fast = dummy;
        ListNode* slow = dummy;
        // 让 fast 指针向前移动 n 步
        for (int i = 0; i <= n; ++i) {
            fast = fast->next;
        }
        // 同时移动 fast 和 slow 指针,直到 fast 指针到达链表末尾
        while (fast) {
            fast = fast->next;
            slow = slow->next;
        }
        // 删除倒数第 n 个结点
        ListNode* temp = slow->next;
        slow->next = slow->next->next;
        delete temp;
        // 返回新的头结点
        ListNode* newHead = dummy->next;
        delete dummy;
        return newHead;
    }
};    

相关文章:

  • 基于kotlin native的C与kotlin互相调用
  • 数值稳定性
  • Linux开发工具——make/makefile
  • 十大排序-20分钟完成
  • Redis-list类型
  • Spring常见问题复习
  • Web前端页面搭建
  • python logging模块
  • ACM代码模式笔记
  • 学透Spring Boot — 011. 一篇文章学会Spring Test
  • 操作系统——2.4 (管程与死锁的基本概念)
  • 第六章:分布式共识_《凤凰架构:构建可靠的大型分布式系统》
  • 解码 __iter__ 和 itertools.islice - 迭代的艺术
  • 数据结构(5)——栈
  • 【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
  • cpp自学 day19(多态)
  • 一周学会Pandas2 Python数据处理与分析-NumPy数据类型
  • 【JavaWeb-Spring boot】学习笔记
  • 通过枚举、AOP、注解、反射填充公共字段
  • MySQL的进阶语法8(SQL优化——insert、主键、order by、group by、limit、count和update)