LeetCode-in-Dart

24. Swap Nodes in Pairs

Medium

Given a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modifying the values in the list’s nodes (i.e., only nodes themselves may be changed.)

Example 1:

Input: head = [1,2,3,4]

Output: [2,1,4,3]

Example 2:

Input: head = []

Output: []

Example 3:

Input: head = [1]

Output: [1]

Constraints:

Solution

/**
 * Definition for singly-linked list.
 * class ListNode {
 *   int val;
 *   ListNode? next;
 *   ListNode([this.val = 0, this.next]);
 * }
 */
class Solution {
  ListNode? swapPairs(ListNode? head) {
    if (head == null) {
      return null;
    }
    int len = getLength(head);
    return reverse(head, len);
  }

  // Function to get the length of the linked list
  int getLength(ListNode? curr) {
    int cnt = 0;
    while (curr != null) {
      cnt++;
      curr = curr.next;
    }
    return cnt;
  }

  // Recursive function to reverse pairs of nodes
  ListNode? reverse(ListNode? head, int len) {
    // Base case: if less than 2 nodes, no need to swap
    if (len < 2) {
      return head;
    }
    ListNode? curr = head;
    ListNode? prev;
    ListNode? next;
    prev = null;

    // Reverse the first two nodes
    for (int i = 0; i < 2; i++) {
      next = curr!.next;
      curr.next = prev;
      prev = curr;
      curr = next;
    }

    // Recursively reverse the rest of the list
    head!.next = reverse(curr, len - 2);
    return prev;
  }
}