[路飞]leetcode-19. 删除链表的倒数第 N 个结点

98 阅读1分钟

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

第一种

这一种是逻辑最简单的一种,先找到链表长度,这样就能得到要删除的链表位置下标(length-n)

var removeNthFromEnd = function (head, n) {
  let emptyNode = new ListNode(-1, head);
  let len = 0;
  let cur = emptyNode;
  while (cur && cur.next) (cur = cur.next), len++;
  cur = emptyNode;
  for (let index = 0; index < len - n; index++) {
    cur = cur.next;
  }
  cur.next = cur.next.next;
  return emptyNode.next;
};

第二种是快慢指针 快指针先走n步,慢指针再从head节点开始走,当快指针走到最后一个,慢指针也就走到了被删除的前一个节点

var removeNthFromEnd1 = function (head, n) {
  let emptyNode = new ListNode(-1, head);
  let slow = emptyNode;
  let fast = emptyNode;
  let count = 1;
  while (fast && fast.next) {
    fast = fast.next;
    debugger;
    if (count > n) {
      slow = slow.next;
    }
    count++;
  }
  slow.next = slow.next.next;
  return emptyNode.next;
};