LeetCode--HOT100题(29)

目录

  • [题目描述:19. 删除链表的倒数第 N 个结点(中等)](#题目描述:19. 删除链表的倒数第 N 个结点(中等))
  • PS:

题目描述:19. 删除链表的倒数第 N 个结点(中等)

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

LeetCode做题链接:LeetCode-删除链表的倒数第 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]

提示:

复制代码
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

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

题目接口

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

    }
}

解题思路

  • 1.本题采用双指针的思路,先让一个指针(后指针)移动到和第一个指针(前指针)相差n+1个元素(也就是中间相隔2个结点)

  • 2.然后一起移动,如果移动到后指针为null,说明前指针的下一个结点就是要删除的倒数第n个元素

  • 3.删除前指针的下一个结点即可

  • 4.最后返回head的值,因为head一直在头部

  • 5.注意:当n和链表长度一致的时候,说明要删的是第一个元素,直接返回head->next即可

注:上面的图片来自:程序员吴师兄

代码

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
		if (head == null) {
            return null;
        }
        ListNode frontPointer = head;
        ListNode backPointer = head;

        while (n-- >= 0) {
            // 判断后指针是否为空,为空停止
            if (backPointer == null) {
            	// 指针为空,且n和链表长度一致,说明要删除的是第一个元素
                if (n == -1) {
                    return head.next;
                }
                return null;
            }
            backPointer = backPointer.next;
        }

        while (true) {
        	// 后指针为空的时候,停止遍历,删除前指针的后一个结点
            if (backPointer == null) {
                frontPointer.next = frontPointer.next.next;
                break;
            }
            // 两个指针遍历
            frontPointer = frontPointer.next;
            backPointer = backPointer.next;
        }
        return head;
    }
}

成功!

PS:

感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个喔~

相关推荐
如竟没有火炬1 天前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi81 天前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术1 天前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
想吃火锅10051 天前
【leetcode】1.两数之和js版
javascript·算法·leetcode
net3m331 天前
一阶软件低通滤波器算法
人工智能·算法
水木流年追梦1 天前
大模型入门-大模型优化方法12-YaRN 长文本外推技术
人工智能·分布式·算法·正则表达式·prompt
J-Tony111 天前
【JVM】三色标记法
java·jvm·算法
wengad1 天前
机器学习实践理论基础|算法、模型和数据集
人工智能·算法·机器学习
梦梦代码精1 天前
为什么这个开源的AI平台会火?有点东西。。。
人工智能·算法·机器学习·docker·开源