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

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

题意:

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

示例:

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

难度:

中等

分析:

题目一共要求做两件事

  1. 找到链表的倒数第n个节点
  2. 删除该节点

对于单项链表, 如何找到节点的位置?

可以两次遍历, 第一次遍历拿链表长度

第二次才获取具体的节点

如何删除该节点?

删除节点涉及到三个部分

前驱节点, 该节点, 后驱节点

所以我们在第一步拿到前驱节点, 并保存后驱节点, 修改引用就算删除完毕

遍历链表

 while (current != null) { length++; current = current.next; }

注意是倒数第 n 个节点,所以要用链表的长度减去 n。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 创建一个虚拟头节点,简化边界条件处理
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        
        // 第一次遍历,计算链表的总长度
        int length = 0;
        ListNode current = head;
        while (current != null) {
            length++;
            current = current.next;
        }
        
        // 设置长度为到达要删除的节点的前一个节点
        int index = length - n;
        current = dummy;
        // 第二次遍历,找到要删除的节点的前一个节点
        for (int i = 0; i < index; i++) {
            current = current.next;
        }
        
        // 删除节点,即跳过要删除的节点
        current.next = current.next.next;
        
        return dummy.next;
    }
}