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

LeetCode 原题链接 image.png

实现思路

  • 定义一个 dummy 节点指向 head,这样可以方便地处理删除头节点的情况。
  • 定义两个指针 slow 和 fast,slow 初始化为 dummy,fast 初始化为 dummy。
  • fast 先向前移动 n 步,这样 slow 和 fast 之间就有 n 个节点的距离。
  • 然后同时移动 slow 和 fast,直到 fast 到达链表的末尾,此时 slow 的下一个节点就是需要删除的节点。
  • 将 slow 的 next 指向 slow 的 next 的 next,即可删除倒数第 n 个节点。

代码实现

var removeNthFromEnd = function (head, n) {
  let dummy = new ListNode(0, head);
  let slow = dummy;
  let fast = dummy;

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

  while (fast.next !== null) {
    slow = slow.next;
    fast = fast.next;
  }

  slow.next = slow.next.next;

  return dummy.next;
};