描述

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

示例

示例1:
remove_ex1.jpg

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

示例2:

输入:head = [1], n = 1
输出:[]

提示

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

解题思路

  1. 声明一个快指针,一个慢指针,初始时,都指向头节点
  2. 快指针先向后移动 n 个节点,然后与慢指针一起移动。当快指针指向最后一个节点时,慢指针指向倒数第 n各节点的前一个节点。
  3. 删除慢指针指向的后一个节点即可。
  4. 为了能删除头节点,声明一个节点 headNode,这个节点的 next 指向头节点,算法从 headNode 开始

代码

/**
 * 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 preHead = new ListNode();
        preHead.next = head;
        ListNode slow = preHead, faster = preHead;
        for (int i = 0; i <= n; i++) {
            faster = faster.next;
        }
        while (faster != null) {
            slow = slow.next;
            faster = faster.next;
        }
        slow.next = slow.next.next;
        return preHead.next;
    }
}