leetcode.24. Intercambiar nodos en la lista enlazada en pares (swap-nodes-in-pairs)

Intercambiar nodos en la lista vinculada en pares (intercambio-nodos-en-pares)

Dada una lista vinculada, intercambie cada dos nodos adyacentes y devuelva su encabezado.

No puede modificar los valores en los nodos de la lista. Solo se pueden cambiar los nodos.

Ejemplo 1:
Inserte la descripción de la imagen aquí

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

Ejemplo 2:

Input: head = []
Output: []

Ejemplo 3:

Input: head = [1]
Output: [1]

Código e ideas

Iteración

Desde el nodo oficial de intercambio-nodos-en-pares (intercambio-nodos-en-pares) en la lista de intercambio por pares.
Inserte la descripción de la imagen aquí
Aquí se define un nodo ficticio, se obtienen el nodo1 y el nodo2, se intercambian y el temppuntero avanza. Tenga en cuenta que la condición de terminación está tempdetrás no solo de un nodo o nodos, no es necesario intercambiar más nodos, finalizando así el intercambio. Al iterar, es muy importante pensar claramente en la condición de terminación.

class Solution {
    
    
public:
    ListNode* swapPairs(ListNode* head) {
    
    
    	//定义一个哑节点
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* temp = dummyHead;
        while (temp->next != nullptr && temp->next->next != nullptr) {
    
    
        	//准备待交换的节点
            ListNode* node1 = temp->next;
            ListNode* node2 = temp->next->next;
            //交换
            temp->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            //移动指针
            temp = node1;
        }
        //返回
        return dummyHead->next;
    }
};

Recursión (un poco difícil)

    public ListNode swapPairs(ListNode head) {
    
    
        //边界条件判断
        if (head == null || head.next == null)
            return head;
        //从第3个链表往后进行交换
        ListNode third = swapPairs(head.next.next);
        //从第3个链表往后都交换完了,我们只需要交换前两个链表即可,
        //这里我们把链表分为3组,分别是第1个节点,第2个节点,后面
        //的所有节点,也就是1 → 2 → 3,我们要把它变为2 → 1 → 3
        ListNode second = head.next;
        head.next = third;			//你可能会觉得,这里不是指向1吗
        second.next = head;
        
        return second;
    }

Descripción head.next = third;Quizás se esté preguntando, este no es el punto para 1el nodo, por qué está apuntando 3, atención, aquí un poco diferente con el enfoque iterativo, devolvemos un nuevo nodo de encabezado, se llama second. Entonces, solíamos secondconectar el siguiente nodo, también puede ajustar el formato del código, como este aspecto.

        			  head.next = third;
        second.next = head;

En otras palabras second -> head -> third.

Desde sdwwld

otro

Definición de ListNode


  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) {}
  };

Supongo que te gusta

Origin blog.csdn.net/e891377/article/details/109046240
Recomendado
Clasificación