[前端]_一起刷leetcode 19. 删除链表的倒数第 N 个结点

155 阅读1分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

题目:

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

 

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

思路:

  1. 使用双指针, 定义快指针fast和慢指针slow;
  2. 先让快指针走n步, 然后两根指针齐头并进。快指针走到终点时, 慢指针所在的位置就是倒数第n个节点;
  3. 这时候我们只需要让满指针的节点跳过下一个节点,指向下下个节点,即可删除指定元素;
  4. 这道题有边界问题,如果删除的是头节点,快指针fast根本不会走,这时候直接返回head.next即可。

实现:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    let fast = head;

    // 倒数的节点, 我们先派个快指针走n步
    while (n > 0) {
        fast = fast.next;
        n--;
    }

    // 如果删除的是头节点
    if (!fast) {
        return head.next;
    }

    let cur = head;

    // 不然就走常规逻辑
    while (fast.next) {
        fast = fast.next;
        cur = cur.next;
    }

    cur.next = cur.next.next;

    return head;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。