https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
原题
给你一个链表,删除链表的倒数第 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 个节点,然后快慢指针一起前进,直到快指针的 next 指向为空,则慢指针的位置指向的节点的 next 指向的则为要删除的节点。
const removeNthFromEnd = (head, n) => {
let pre = head
let last = head
while(n--) pre = pre.next
if(!pre) return head.next
while(pre.next) {
pre = pre.next
last = last.next
}
last.next = last.next.next
return head
}
时间复杂度为 o(n)
,空间复杂度为 o(1)
。