19. leetCode删除链表的倒数第 N 个结点

29 阅读1分钟

复杂度分析

  • 时间复杂度:O(L)\mathcal {O}(_L),其中 L 是链表的长度。
  • 空间复杂度:O(1)\mathcal {O}(_1)
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;
}