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;
    }
}
相关推荐
小白不想白a27 分钟前
每日手撕算法--哈希映射/链表存储数求和
数据结构·算法
怪兽201442 分钟前
什么是 Redis?
java·数据库·redis·缓存·面试
剪一朵云爱着42 分钟前
力扣2080. 区间内查询数字的频率
算法·leetcode
Gu_yyqx1 小时前
Java 队列
java
落日漫游1 小时前
数据结构笔试核心考点
java·开发语言·算法
Doro再努力1 小时前
数据结构04:力扣顺序表3道例题解题思路与代码实现
c语言·数据结构
Dream it possible!1 小时前
LeetCode 面试经典 150_栈_有效的括号(52_20_C++_简单)(栈+哈希表)
c++·leetcode·面试··哈希表
疯狂吧小飞牛1 小时前
Lua C API 中的注册表介绍
java·c语言·lua
kyle~1 小时前
C++--- override 关键字 强制编译器验证当前函数是否重写基类的虚函数
java·前端·c++
Hello.Reader1 小时前
Flink 受管状态的自定义序列化原理、实践与可演进设计
java·网络·flink