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

79 阅读1分钟

参加了 kkb 的门徒培训,想要记录下自己的成长过程。每天一篇,坚持不断更 --- 2022.3.9

题目描述

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

解题思路

对于链式结构,我们并不能很直观的找到倒数第n元素,这时候我们可以用前后指针的形式,另前指针为后指针的第n个指针,双指针一同往前走,当前指针为null时,我们便找到了倒数第n个指针

/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function (head, n) {
  // len > 0 && 1 <= n <= len 可能删除第一个点
  // 设置虚拟头节点
  let hair = new ListNode(-1, head),
    p = hair,
    q = head;

  // 我们利用前后指针去查找倒数的第n个点
  while (n--) {
    q = q.next;
  }

  while (q) {
    p = p.next;
    q = q.next;
  }

  // 找到后将其移除
  p.next = p.next.next;

  return hair.next;
};