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]

·解题思路

使用快慢指针,慢指针比快指针晚出发n步.如图所示,当快指针到达链表尾部的时候,slow指针刚好到达要删除的结点的前一个结点。此时的删除语句: slow.next = slow.next.next

·Java代码

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode slow = head;
        ListNode fast = head;
        if(head.next == null) return null;
        while(fast.next != null){
            fast = fast.next;
            if(n != 0) n --;
            else slow = slow.next;
        }
        slow.next = slow.next.next;
        return head;
    }
}

但是上述代码存在的问题在于,当需要删除头结点的时候出现错误。因此为了删除头结点需要创建一个dummy空结点,dummy.next = head 这时候就可以删除头结点了。

·改进代码

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode slow = dummy;
        ListNode fast = dummy;

        if(head.next == null) return null;
        while(fast.next != null){
            fast = fast.next;
            if(n != 0) n --;
            else slow = slow.next;
        }
        slow.next = slow.next.next;
        return dummy.next;
    }
}
相关推荐
风象南4 分钟前
SpringBoot实现简易直播
java·spring boot·后端
半桔12 分钟前
【算法深练】分组循环:“分”出条理,化繁为简
数据结构·c++·算法·leetcode·面试·职场和发展
天天爱吃肉821812 分钟前
【十年技术演进深度解构:车载充电机(OBC)将成为新能源汽车的“能源大脑”】
python·嵌入式硬件·算法·汽车·能源
万能程序员-传康Kk13 分钟前
智能教育个性化学习平台-java
java·开发语言·学习
@Mr_LiuYang23 分钟前
Mermaid 绘图--以企业权限视图为例
数据结构·mermaid·结构图·层次权限·权限关系图
落笔画忧愁e23 分钟前
扣子Coze飞书多维表插件-列出全部数据表
java·服务器·飞书
KerwinChou_CN25 分钟前
自由开发者计划 004:创建一个苹果手机长截屏小程序
图像处理·算法·智能手机·小程序
鱼儿也有烦恼26 分钟前
Elasticsearch最新入门教程
java·elasticsearch·kibana
eternal__day36 分钟前
微服务架构下的服务注册与发现:Eureka 深度解析
java·spring cloud·微服务·eureka·架构·maven
一介草民丶42 分钟前
Jenkins | Linux环境部署Jenkins与部署java项目
java·linux·jenkins