Lectura

Dada una lista enlazada, intercambie cada dos nodos adyacentes y devuelva su cabeza.

1 2 3 4 2 1 4 3

Debe resolver el problema sin modificar los valores en los nodos de la lista (es decir, solo se pueden cambiar los nodos).

Explicación del ejercicio Paso por paso

Código de la solución

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { 
 *      this.val = val; this.next = next; 
 *     }
 * }
 */
public class Solution {

    public static ListNode swapPairs(ListNode head) {
        // paso #1
        if (head == null || head.next == null) {
            return head;
        }

        // paso #2
        ListNode home = head.next;

        // paso #3
        ListNode end = head;

        while (head != null && head.next != null) {
            // Pasos para voltear los pares de nodos
            ListNode aux = head.next; // paso #4
            end.next = aux; // paso #5
            head.next = aux.next; // paso #6
            aux.next = head; // paso #7

            // Pasos para actualizar los punteros
            end = head; // paso #8
            head = head.next; // paso #9
        }

        // retornamos el puntero home
        return home;
    }
}

Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def swapPairs(self, head):
        # paso #1
        if head is None or head.next is None:
            return head

        # paso #2
        home = head.next

        # paso #3
        end = head

        while head and head.next:
            # Pasos para voltear los pares de nodos
            aux = head.next           # paso #4
            end.next = aux            # paso #5
            head.next = aux.next     # paso #6
            aux.next = head           # paso #7

            # Pasos para actualizar los punteros
            end = head                 # paso #8
            head = head.next          # paso #9

        # retornamos el puntero home
        return home

PHP

/**
 * Definition for a singly-linked list.
 * class ListNode {
 *     public $val = 0;
 *     public $next = null;
 *     function __construct($val = 0, $next = null) {
 *         $this->val = $val;
 *         $this->next = $next;
 *     }
 * }
 */
class Solution {
 
    /**
     * @param ListNode $head
     * @return ListNode
     */
    function swapPairs($head) {
        //paso #1
        if(!$head->next || !$head) return $head;
 
        //paso #2
        $home=$head->next;
 
        //paso #3
        $end=$head;
 
        while ($head->next){
 
            //Pasos para voltear los pares de nodos
            $aux=$head->next;           //paso #4
            $end->next=$aux;            //paso #5
            $head->next=$aux->next;     //paso #6
            $aux->next=$head;           //paso #7
 
            //Pasos para actualizar los punteros
            $end=$head;                 //paso #8
            $head=$head->next;          //paso #9
        }
 
        //retornamos el puntero home
        return $home;
    }
} 

C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
      ListNode* swapPairs(ListNode* head) {
    // paso #1
    if (!head || !head->next) return head;

    // paso #2
    ListNode* home = head->next;

    // paso #3
    ListNode* end = head;

    while (head && head->next) {
      // Pasos para voltear los pares de nodos
      ListNode* aux = head->next; // paso #4
      end->next = aux; // paso #5
      head->next = aux->next; // paso #6
      aux->next = head; // paso #7

      // Pasos para actualizar los punteros
      end = head; // paso #8
      head = head->next; // paso #9
    }

    // retornamos el puntero home
    return home;
  }
};

JavaScript

/**
 * 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}
 */
var swapPairs = function(head) {
        // paso #1
    if (!head || !head.next) return head;

    // paso #2
    const home = head.next;

    // paso #3
    let end = head;

    while (head && head.next) {
      // Pasos para voltear los pares de nodos
      const aux = head.next; // paso #4
      end.next = aux; // paso #5
      head.next = aux.next; // paso #6
      aux.next = head; // paso #7

      // Pasos para actualizar los punteros
      end = head; // paso #8
      head = head.next; // paso #9
    }

    // retornamos el puntero home
    return home;
};

Si te gustó el contenido, ¡visita mi canal de YouTube para ver más explicaciones sobre algoritmos y estructuras de datos!