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;
    }
}
相关推荐
Wei&Yan2 分钟前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
爬山算法5 分钟前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
云姜.18 分钟前
线程和进程的关系
java·linux·jvm
是码龙不是码农19 分钟前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧20 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..20 分钟前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy23 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇29 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
团子的二进制世界36 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
吃杠碰小鸡40 分钟前
高中数学-数列-导数证明
前端·数学·算法