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:

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

相关推荐
地平线开发者13 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球16 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao1 天前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1121 天前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余1 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天2 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源2 天前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang