Swapping Nodes in a Linked List

MediumLinked ListTwo Pointers

Solution

import { ListNode } from '@algorithm/lib';
 
export function swapNodes(head: ListNode | null, k: number): ListNode | null {
  const findNode = (node: ListNode | null, k: number): ListNode | null => {
    let currentNode = node;
    for (let i = 1; i < k; i++) {
      if (currentNode === null) {
        return null;
      }
      currentNode = currentNode.next;
    }
    return currentNode;
  };
 
  const kthNode = findNode(head, k);
 
  if (head === null || kthNode === null) {
    return null;
  }
 
  let [startNode, endNode] = [head, kthNode];
 
  while (startNode.next !== null && endNode.next !== null) {
    startNode = startNode?.next;
    endNode = endNode.next;
  }
 
  [startNode.val, kthNode.val] = [kthNode.val, startNode.val];
 
  return head;
}