其实还算比较简单的一个题。链表往往会和双指针绑定在一起。
因为链表这个数据结构的特点,并且链表长度未知,不太可能会有小于 O ( n ) O(n) O(n) 的解法出现。
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
let slow = head,
fast = head,
last = null;
while (n) {
fast = fast!.next;
--n;
}
if (!fast) return head!.next;
while (fast) {
last = slow;
slow = slow!.next;
fast = fast.next;
}
last!.next = slow!.next;
return head;
}
因为题目中说:
给定的 n 保证是有效的。
这意味着,在给定的 n 下,链表的长度不可能小于 n,快指针先走 n 步就不需要做额外检查。
此外,如果快指针先走 n 步之后已经到达了链表结尾,这意味着要删除的就是头结点,直接返回头结点的下一个结点即可。