19 删除链表的倒数第 N 个结点

题目链接: LeetCode

19 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 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

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

Related Topics: 链表, 双指针

Likes: 3122 | Dislikes: 0

解题代码

/**
 * @author Charlie Zhang
 * @version v1.0
 * @date 2025-06-17 05:58:04
 * @description 19 删除链表的倒数第 N 个结点
 */
public class RemoveNthNodeFromEndOfList {
    public static void main(String[] args) {
        Solution solution = new RemoveNthNodeFromEndOfList().new Solution();
    }

    class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    /**
     * 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) {
            ListNode dummy = new ListNode(-1);
            dummy.next = head;

            ListNode slow = dummy;
            ListNode fast = dummy;

            while (n-- > 0) {
                fast = fast.next;
            }
            fast = fast.next; // 快指针先走1步
            while (fast != null) {
                slow = slow.next;
                fast = fast.next;
            }
            slow.next = slow.next.next;
            return dummy.next;
        }
    }

}
posted @ 2025-10-02 10:44  Charlie_Byte  阅读(6)  评论(0)    收藏  举报