https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/

原题

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?

示例 1:
image.png
输入: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 个节点,然后快慢指针一起前进,直到快指针的 next 指向为空,则慢指针的位置指向的节点的 next 指向的则为要删除的节点。
image.png

  1. const removeNthFromEnd = (head, n) => {
  2. let pre = head
  3. let last = head
  4. while(n--) pre = pre.next
  5. if(!pre) return head.next
  6. while(pre.next) {
  7. pre = pre.next
  8. last = last.next
  9. }
  10. last.next = last.next.next
  11. return head
  12. }

时间复杂度为 o(n),空间复杂度为 o(1)