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

130 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给你一个链表,删除链表的倒数第 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 指针在第一次循环后,为 null 的话,我们需要直接返回 head.next 的值。

如果 fast 指针不为空的话,则开始新的循环判断, fastfast.next 是否为空,一直往后查找

最终将 slow.next = slow.next.next 即可删除倒数节点。

下面这里用图进行示意。

  • 初始情况下

    n=2,意思删除倒数第二个节点

    image.png

  • 第N次

    看到 fast.next 为空,则我们的 slow.next = slow.next.next 直接会将倒数第二个节点,直接删除。

    image.png

    const removeNthFromEnd = (head, n) => {
      let slow = head
      let fast = head

      for (let i = 0; i < n; ++i) {
        fast = fast.next
      }

      if (!fast) {
        return head.next
      }

      while (fast && fast.next) {
        slow = slow.next
        fast = fast.next
      }

      slow.next = slow.next.next
      return head
    }

总结

题目 6 :链表的操作,大部分都会通过 双指针算法 来解答。