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

202 阅读1分钟

题目描述

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

分析

输入:链表头节点 head 输出:删除指定的节点之后的链表头节点

解题思路

这道题目可以用双指针的方法求解,不同于快慢指针,我们在本题中用到的双指针,都会只走一步,但是其中一个指针会先走 n 步,目的是在慢指针走完之后,正好走到要删除节点的前驱节点,因为我们知道要删除一个节点的方法只能是让他的前驱节点 pre.next = pre.next.next 这样去短引用。

我们用一张图说明:

image.png

n = 1 的情况下,让 fastdummyHead 先走一步,然后两个一起走,我们可以看到,当 fast 到最后一个节点时候,注意⚠️,不是到 null,我们只走到最后一个节点,slow 正好是要找的前驱节点,所以接下来要做的,就是删除操作了~

代码

/**
 * 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;
  let slow = head;

  for (let i = 0; i < n; i++) fast = fast.next;
  if (!fast) return head.next;

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

  slow.next = slow.next.next;

  return head;
};

复杂度

时间:O(N), 遍历一遍链表
空间:O(1), 需要几个指针