题目描述

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

思路&js代码

1、左右指针

var removeNthFromEnd = function(head, n) {
    // 由于可能会删除链表头部,用哨兵节点简化代码
    const dummy = new ListNode(0, head);
    let left = dummy;
    let right = dummy;
    while (n--) {
        right = right.next; // 右指针先向右走 n 步
    }
    while (right.next) {
        left = left.next;
        right = right.next; // 左右指针一起走
    }
    left.next = left.next.next; // 左指针的下一个节点就是倒数第 n 个节点
    return dummy.next;
};