给你一个链表,删除链表的倒数第 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
进阶:你能尝试使用一趟扫描实现吗?
解法
定义两个指针,fast 和 low,fast 先走 n 步,之后 low 和 fast 每一次都各走一步,直到 fast.next 为null,此时 删除 low 的下一个节点就是该删除的。这里要特殊处理删除头节点
vbscript
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
if (head === null) return null
let fast = head
let low = null
let i = 1
while(i < n) {
fast = fast.next
i++
}
if (fast && fast.next) {
while(fast.next) {
fast = fast.next
low = low ? low.next: head
}
// 删除 low 的下一个
low.next = low.next.next
return head
} else { // 删除第一个节点
return head.next
}
};
时间复杂度O(n),空间负责度O(1)