LeetCode-in-All

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.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
const swapPairs = function (head) {
    if (head === null) {
        return null
    }

    const getLength = (node) => {
        let count = 0
        while (node !== null) {
            count++
            node = node.next
        }
        return count
    };

    const reverse = (node, length) => {
        if (length < 2) {
            return node
        }

        let current = node
        let prev = null
        let next

        for (let i = 0; i < 2; i++) {
            next = current.next
            current.next = prev
            prev = current
            current = next
        }

        node.next = reverse(current, length - 2)
        return prev
    };

    const len = getLength(head)
    return reverse(head, len)
};

export { swapPairs }