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

news/2024/9/1 23:35:47 标签: 链表, leetcode, 数据结构

原题链接

难度: m i d d l e \color{orange}{middle} middle

题目描述

给你一个链表,删除链表的倒数第 n 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]

提示:

  • 链表中结点的数目为 s z sz sz
  • 1 < = s z < = 30 1 <= sz <= 30 1<=sz<=30
  • 0 < = N o d e . v a l < = 100 0 <= Node.val <= 100 0<=Node.val<=100
  • 1 < = n < = s z 1 <= n <= sz 1<=n<=sz

进阶: 你能尝试使用一趟扫描实现吗?


算法

  1. 题目中给的是倒数第几个结点,如果找出倒数的第几个数字?
  2. 删除结点是在原链表上删除还是更新在新的链表上?

自己的想法:链表是否需要翻转然后删除第几个结点 (×) 太麻烦

结论:可分为两次遍历和一次遍历。

(两次遍历)

链表题目,头节点特判。使用虚拟头节点。

  1. 第一次遍历求出链表长度。
  2. 第二次遍历删掉指定结点。
  3. head 前新增 dummy 节点的方式避免删除首结点时出现问题。

C++ 代码

/**
 * 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) {
        auto dummy = new ListNode(-1);
        dummy->next = head;

        int list_size = 0;
        for (auto p = dummy; p; p = p->next) list_size ++;

        auto p = dummy;
        for (int i = 0; i < list_size - n - 1; i ++) p = p->next;
        p->next = p->next->next;

        return dummy->next;
    }
};

(一次遍历)

  1. 一次遍历的思路是设置两个指针,让其中一个指针先走 n 步,然后两个指针再同时走。当第二个指针走到最后时,第一个指针的位置就是需要被删除的节点。
  2. head 前添加 dummy 节点,避免出现边界问题。
  3. 设置两个指针 p 1 p_1 p1 p 2 p_2 p2,均初始化为 dummy 节点。
  4. p 2 p_2 p2 指针先移动 n 次,然后 p 1 p_1 p1 p 2 p_2 p2 指针同时向后移动,直到 p 2 p_2 p2 指向最后一个节点。
  5. 此时 p 1 p_1 p1 结点指向的下一个结点需要删除。

C++ 代码

/**
 * 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) {
        ListNode *dummy = new ListNode(0, head);

        auto *p1 = dummy, *p2 = dummy;

        while(n --) 
            p2 = p2->next;

        while(p2->next) {
            p1 = p1->next;
            p2 = p2->next;
        }

        p1->next = p1->next->next;

        return dummy->next;
    }
};

http://www.niftyadmin.cn/n/66748.html

相关文章

2023年全国最新安全员精选真题及答案

百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题 1.&#xff08;单选题&#xff09;起吊设备时&#xff0c;电动卷扬机卷筒…

膳食锌缺乏或过量对人体肠道菌群及健康的影响

谷禾健康 锌与肠道微生物 锌(Zn)是人体必需的微量元素&#xff0c;是人体中第二丰富的矿物质。锌在细胞和器官功能中起着关键的催化、调节和结构作用。 ★ 膳食锌缺乏或过量均不健康 锌缺乏与发育不良、免疫功能低下、味觉丧失、不良妊娠结局、脱发、皮肤损伤和神经行为异常有关…

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…

Asp Cookies ,Asp写入Cookies数据,Asp读取Cookies数据

写入Cookies数据 Response.Cookies("myCookies") "myCookies666" 你存储的值&#xff0c;括号里面是值的名称Response.Cookies("myCookies").Expires Date1 过期时间&#xff0c;Data是当前日期Response.Cookies("myCookies").path …

自动化测试工程师的发展前景怎么样?

根据各大网络招聘平台的数据显示&#xff0c;越来越多的企业在招聘测试工程师的时候&#xff0c;都开始重视自动化测试这一重要技能。早在四年前&#xff0c;自动化测试的人才需求和薪资待遇就开始一路上涨。如果你问&#xff1a;自动化测试工程师的发展前景怎么样&#xff1f;…

大数据---zookeeper集群搭建

zookeeper集群搭建 跳过安装jdk的方法就是找到安装jdk环境的虚拟机克隆 克隆之后的虚拟机根据台数直接修改ip地址&#xff0c;重新配置免密登录&#xff0c;确保每台机器能够互相连接&#xff0c;然后安装zookeeper 文章目录zookeeper集群搭建前期工作服务器划分修改hostname设…

HTML+CSS

HTML技术 什么是HTML Hyper Text Markup Language HTML&#xff1a;超文本标记语言&#xff0c;内部全部是一些不同的标记符号。 通俗的来讲&#xff1a;其实就是“网页”。 HTML 网页 网页的特点&#xff1a; 1、所有的网页都是通过【浏览器】来进行解析的。2、所有的网…

JVM类加载机制

回到2018年的抖音哈哈. 回顾下&#xff1a; java开发环境: java编译运行过程: 1) 编译期&#xff1a;.java源文件&#xff0c;经过编译&#xff0c;生成.class字节码文件 2) 运行期&#xff1a;JVM加载.class并运行.class(0和1) 特点: 跨平台、一次编程,处处报错 名词解释: 1…