[路飞]_ 删除链表的倒数第 N 个结点

165 阅读1分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

题目描述

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

力扣(LeetCode)leetcode-cn.com/problems/re…

解题思路

  1. 通过双指针找到倒数第 n 个节点 back,back 的前一个节点 prev
  2. 将 prev 的下个节点指向 back 的下个节点
  3. 如果 prev 为空则代表删除头节点,返回 head.next 即可
  4. 如果 prev 不为空时返回head   示例 1:

输入: head = [1,2,3,4,5], n = 2
输出: [1,2,3,5]

代码实现

var removeNthFromEnd = function(head, n) {
  let front = back = head
  let prev = null

  //指针从头走 n-1 步找到第 n 个节点
  while (--n) {
    front = front.next
  }

  //双指针同时走,前面指针到达链表位节点时,后指针为倒数第 n 个节点
  //记录第 n 个节点的前一个节点 prev
  while (front.next) {
    front = front.next
    prev = back
    back = back.next
  }

  //如果 prev 为空则表示删除头节点
  if (!prev) return head.next

  //删除 back 节点,即将 back 的前节点指向 back 的后一个节点
  prev.next = back.next

  return head
}

如有错误欢迎指出,欢迎一起讨论!