[LeetCode] 19. 删除链表的倒数第 N 个结点

1. 问题描述

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)


2. 实现思路

2.1 自己的思路

~~(一定要写出来啊喂)~

  • 先遍历一遍获取链表长度,再结合虚拟头节点删除
public class Solution
{
    public ListNode RemoveNthFromEnd(ListNode head, int n)
    {
        var dummyHead = new ListNode(0, head);
        var preHead = dummyHead;
        var temp = dummyHead;
        int count = 0;
        while (temp.next != null)
        {
            count++;
            temp = temp.next;
        }

        for (int i = 0; i < count - n; i++)
            preHead = preHead.next;

        preHead.next = preHead.next?.next;

        return dummyHead.next;
    }
}

2.2 题解思路

19.删除链表的倒数第N个节点 | 双指针 | 虚拟头节点

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

public class Solution {
    public ListNode RemoveNthFromEnd(ListNode head, int n) {
        ListNode dummpHead = new ListNode(0);
        dummpHead.next = head;
        var fastNode = dummpHead;
        var slowNode = dummpHead;
        while(n-- != 0 && fastNode != null)
        {
            fastNode = fastNode.next;
        }
        while(fastNode.next != null)
        {
            fastNode = fastNode.next;
            slowNode = slowNode.next;
        }
        slowNode.next = slowNode.next.next;
        return dummpHead.next;
    }
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

2.3 优化(或者敲一遍题解?)

好的也是很经典的双指针啊

public class Solution
{
    public ListNode RemoveNthFromEnd(ListNode head, int n)
    {
        var dummyHead = new ListNode(0, head);
        var fast = dummyHead.next;
        var slow = dummyHead;
        while (n-- != 0)
            fast = fast.next ?? null;

        while (fast != null)
        {
            fast = fast.next;
            slow = slow.next;
        }

        slow.next = slow.next?.next;
        return dummyHead.next;
    }
}

3. 补充知识と杂谈,总结

不过有一说一,也是第一次花十多分钟解出一个mid难度的题,虽然离最优解还差一些距离

但从写完这篇笔记来看一共花了二十四分钟,嗯嗯以后也继续保持叭~每个题都控制在半个小时以内喵

posted @ 2026-08-10 13:01  绘星tsuki  阅读(4)  评论(0)    收藏  举报