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

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

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 :

 

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

解题思路:

使用一趟扫描实现。这里就是双指针的经典应用。如果要删除倒数第n个节点,让fast移动x步,然后让fast和slow同时移动,直到fast指向链表末尾的下一个结点nullptr,这时候大家才会停下来。

那么问题来了,应该是先让fast指针移动多少步才合理呢。

首先,我们使用虚拟头结点,这样方便处理删除实际头结点的逻辑。

那么,快慢指针都是从虚拟头结点出发的。使用上图的例子,也添加虚拟头结点,那一共有5个结点(虚拟头结点不算是结点)。要让fast指针走到nullptr,那需要走6(5+1)步。而要慢指针走到被删除的结点的前一结点停下来,那需要slow指针走3(5-2)步。

一般化:

那么,设一共有k个结点,那fast指针走到nullptr,那需要走k+1步slow指针要走到被删除的结点的前一结点,需要走(k-n)步

一开始,假设fast指针先走x步,接着fast,slow指针同时走,而slow指针走(k-n)步,就停下来,而fast指针也就跟着走(k-n)步就走到了nullptr。

所以k+1=(k-n)+x; x=n+1;

所以fast指针需要先走n+1步

理解了这个,代码就好写了。

代码:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto dumyhead=new ListNode(0,head);

        auto fast=dumyhead;
        for(int i=0;i<=n;++i)
            fast=fast->next;
        
        auto slow=dumyhead;
        while(fast){
            fast=fast->next;
            slow=slow->next;
        }
        //这里没有写到delete 结点
        slow->next=slow->next->next;
        

        return dumyhead->next;
    }
};

相关文章:

  • [用前必读]如何使用MyEclipse的工作台和透视图
  • 华为OD机试用java实现 -【最多获得的短信条数】(2023-Q1 新题)
  • 12、POI之数据导入导出
  • 大家好,我是火旺技术
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • 自适应平移混音方法
  • 网路编程---实验1 Java I/O和Java线程应用
  • 【2023.3.18 美团校招】
  • 【华为OD机试 2023最新 】 寻找相似单词(C++ 100%)
  • 新目标大学英语综合教程1-4
  • 指针的用法和注意事项(三)
  • Python(白银时代)——模块、包、异常
  • 网络安全专家最爱用的9大工具
  • 处理机调度典型调度算法
  • HBase客户端、服务器端、列簇设计、HDFS相关优化,HBase写性能优化切入点,写异常问题检查点
  • #Java异常处理
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Cumulo 的 ClojureScript 模块已经成型
  • Debian下无root权限使用Python访问Oracle
  • Facebook AccountKit 接入的坑点
  • Laravel5.4 Queues队列学习
  • Redux 中间件分析
  • REST架构的思考
  • Spring Cloud Feign的两种使用姿势
  • vue的全局变量和全局拦截请求器
  • 大数据与云计算学习:数据分析(二)
  • 电商搜索引擎的架构设计和性能优化
  • 分布式任务队列Celery
  • 深入 Nginx 之配置篇
  • 阿里云API、SDK和CLI应用实践方案
  • ​如何防止网络攻击?
  • ​业务双活的数据切换思路设计(下)
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • "无招胜有招"nbsp;史上最全的互…
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (Git) gitignore基础使用
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (四)汇编语言——简单程序
  • (转)setTimeout 和 setInterval 的区别
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)虚函数剖析
  • .Net 6.0 处理跨域的方式
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core控制台应用程序初识
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 使用 XPath 来读写 XML 文件
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @Autowired和@Resource的区别
  • @Repository 注解