Remove Nth Node From End of List

MediumLinked ListTwo Pointers

Solution

import { ListNode } from '@algorithm/lib';
 
export function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
  if (head === null) {
    return null;
  }
  let lastNode: ListNode | null = head;
  let prevNode: ListNode | null = head;
 
  for (let i = 0; i < n; i++) {
    if (lastNode) {
      lastNode = lastNode.next;
    }
  }
 
  if (!lastNode) {
    return head.next;
  }
 
  while (lastNode.next !== null) {
    lastNode = lastNode.next;
    if (prevNode) prevNode = prevNode.next;
  }
 
  if (prevNode && prevNode.next) {
    prevNode.next = prevNode.next.next;
  }
 
  return head;
}