# [19] 删除链表的倒数第N个节点

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

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

这道题用正常思维很好解决,链表最大的问题就是不知道链表长度,那么只需要一次遍历并计数即可获取,然后在第二次遍历是寻找第length - n个节点即可得到倒数第k个节点了。

题目要求一次遍历搞定,那又要祭出我们的快慢指针大法了,先让快指针走n - 1步,然后慢指针和快指针一同前进,当快指针遍历到末尾了自然慢指针就走到了length - n的位置了。

注意加上一个虚头结点再开始遍历,防止删除的元素为头结点。

var removeNthFromEnd = function(head, n) {
  const nude = new ListNode(null);
  nude.next = head;

  let slow = nude;
  let fast = nude;

  while (n--) {
    fast = fast.next;
  }

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

  return nude.next;
};

function ListNode(val) {
  this.val = val;
  this.next = null;
}