(leetcode)力扣100 29删除链表的倒数第 N 个结点(双指针)

题目

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

数据范围

链表中结点的数目为 sz

1 <= sz <= 30

0 <= Node.val <= 100

1 <= n <= sz

测试用例

示例1

java 复制代码
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例2

java 复制代码
输入:head = [1], n = 1
输出:[]

示例3

java 复制代码
输入:head = [1,2], n = 1
输出:[1]

题解(双指针,博主捞比版本)

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||head.next==null){
            return null;
        }
       
        int temp=n;
        ListNode pre=head;
        boolean flag=false;
        ListNode pos=null;
        int len=0;
        while(pre!=null){
            len++;
            pre=pre.next;
            if(flag) pos=pos.next;
            if(n>=0){
                n--;
            }
            
            if(n<0&&flag==false){
                pos=head;
                flag=true;
            }
        }
        if(len==temp){
            head=head.next;
        }else{
            pos.next=pos.next.next;
        }
    
        return head;
    }
}

题解2 (双指针,官方版)

java 复制代码
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 1. 定义虚拟头节点,指向 head,方便处理删除头节点的情况
        ListNode dummy = new ListNode(0, head);
        ListNode fast = head;
        ListNode slow = dummy;

        // 2. 让快指针先走 n 步
        for (int i = 0; i < n; i++) {
            fast = fast.next;
        }

        // 3. 快慢指针同步移动,直到快指针走到末尾
        // 此时 slow 会恰好停在待删除节点的前一个位置
        while (fast != null) {
            fast = fast.next;
            slow = slow.next;
        }

        // 4. 执行删除
        slow.next = slow.next.next;

        return dummy.next;
    }
}

思路

这道题依然很简单,对于链表的删除操作,在O1空间下,并且只扫描一次,可以使用双指针进行操作,如何使用双指针,看官解就行了,博主虽然也写出来了,效率也一样,但可读性太差,也完全不规范,建议记忆规范版本即可。

相关推荐
菜鸟233号1 小时前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
狐571 小时前
2026-01-18-LeetCode刷题笔记-1895-最大的幻方
笔记·算法·leetcode
Q741_1472 小时前
C++ 队列 宽度优先搜索 BFS 力扣 662. 二叉树最大宽度 每日一题
c++·算法·leetcode·bfs·宽度优先
Pluchon2 小时前
硅基计划4.0 算法 动态规划进阶
java·数据结构·算法·动态规划
踩坑记录2 小时前
leetcode hot100 54.螺旋矩阵 medium
leetcode
wzf@robotics_notes2 小时前
振动控制提升 3D 打印机器性能
嵌入式硬件·算法·机器人
机器学习之心3 小时前
MATLAB基于多指标定量测定联合PCA、OPLS-DA、FA及熵权TOPSIS模型的等级预测
人工智能·算法·matlab·opls-da
Loo国昌3 小时前
【LangChain1.0】第八阶段:文档处理工程(LangChain篇)
人工智能·后端·算法·语言模型·架构·langchain
xb11323 小时前
Winforms实战项目:运动控制界面原型
算法
MicroTech20253 小时前
微算法科技(NASDAQ :MLGO)量子安全哈希(QSHA),增强量子时代的区块链安全保障
科技·算法·安全