复杂度分析
- 时间复杂度:,其中 L 是链表的长度。
- 空间复杂度:
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
//最后将指向最后一个节点的指针
let endP = head;
// 最后将指向被删除节点的指针
let delP = head;
//将endP指针向后移动n个节点,delP指针和endP指针之间的距离就是n的值
while (n--) {
endP = endP!.next;
}
//如果链表有3个节点,而n为3,此时endP则指向最后一个节点,为null
if (!endP) return head!.next;
//将两个指向同时向后移动,直到endP指针的的next为null,
//此时endP为最后一个节点,delP则为要删除的节点
while (endP?.next) {
endP = endP.next;
delP = delP!.next;
}
//由于链表在内存中是通过每个节点的指针指向它的直接后继
//所以以下操作其实是跳过了被删除的节点,而该节点此时依然留在内存中
delP!.next = delP!.next!.next;
return head;
}