leetcode:19.删除链表的倒数第N个节点

简介: 题目已经给出了链表类,此链表比较简单,是个单链表,并且还有一个构造方法。链表是数据结构中比较常见的一种,优点就是增删比较快

题目描述:


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


示例:


给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.


说明:


给定的 n 保证是有效的。


题目难度:中等

分析:


题目已经给出了链表类,此链表比较简单,是个单链表,并且还有一个构造方法。链表是数据结构中比较常见的一种,优点就是增删比较快,对于这题来说,题目的要求是删除倒数第N个节点,所以我们只需要找到倒数第N个节点在哪,然后把它的前一个节点指向它的后一个节点,即可删除此节点。那么问题就是我们究竟怎么才能准确的找到这个节点呢?其实我们只需要用两个指针即可,让他们之间保持恒定的N个距离,然后把其中一个移动到最后的null节点,那么另一个就在倒数第N+1的节点位置了。


代码如下:


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
      // 定义一个空节点作为结果,并且指向head节点
        ListNode res = new ListNode(0);
        res.next = head;
        // 用两个指针分别指向res节点
        ListNode p = res;
        ListNode q = res;
        // 利用循环让p指针移动N+1次,因为此时的p是指向res的,所以移动N+1次就是正数第N个节点(下标从0开始)
        // 这样的话p和q之间就间隔了N个节点
        for (int i = 0; i < n + 1; i ++) {
            p = p.next;
        }
        // 让p指针指向链表的最后一位的下一位(就是指向null)
        // 因为p和q是同时移动的,那么此时的q指针就指向了倒数第N+1位(下标从1开始)
        while (p != null) {
            p = p.next;
            q = q.next;
        }
        // 这时只要把q指针的next位指向下下一位就可以跳过这个倒数第N位啦。
        q.next = q.next.next;
        return res.next;
    }
}


这里借用一下leetcode官方题解的图,让大家更容易理解。


20190401221512272.png


总结:


时间复杂度为O ( n ) ,n为链表的节点个数,这里只进行了一次遍历。

目录
相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
156 1
|
5月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
256 1
|
7月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
268 10
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
166 0
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
155 0
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
258 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
248 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
166 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
358 2