Dado el nodo principal de la lista enlazada individualmente , invierta la lista enlazada y devuelva la lista enlazada invertida. head
Ejemplo uno:
Entrada: cabeza = [1,2,3,4,5]
Salida: [5,4,3,2,1]
Ejemplo dos:
Entrada: cabeza = [1,2]
Salida: [2,1]
Ejemplo tres:
Entrada: cabeza = [ ]
salida: [ ]
insinuación:
- El número de nodos en la lista enlazada varía de
[0, 5000]
-5000 <= Node.val <= 5000
Idea uno:
Podemos recorrer la lista enlazada de adelante hacia atrás, usar tres punteros para señalar el nodo actual cur, el nodo predecesor prev, el nodo sucesor curNext y luego señalar el siguiente del nodo actual a prev
Nota: Si no hay curNext, entonces el nodo detrás de cur no se puede encontrar directamente después de modificar cur.next
El proceso intermedio es el siguiente:
código
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) { // 空链表直接返回
return head;
}
ListNode prev = null;
ListNode cur = head;
ListNode next;
while (cur != null) {
next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev; // 循环结束之后prev指向原链表的最后一个结点,也就是新链表的第一个节点
}
}
Análisis de Complejidad
Complejidad de tiempo: O(N) atravesando la lista enlazada, N es la longitud de la lista enlazada
Complejidad espacial: O(1)
Idea dos:
recursión
Ir al último nodo de la lista enlazada en el proceso de paso. La restricción recursiva es la condición final de atravesar toda la lista enlazada. En el proceso de retorno, se completa la modificación del siguiente punto.
Código:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
Análisis de Complejidad
Complejidad de tiempo: O(N), N es la longitud de la lista enlazada y se realiza una siguiente operación de modificación en cada nodo
Complejidad del espacio: O(N), N es la longitud de la lista enlazada, la complejidad de recurrencia depende principalmente del espacio de pila ocupado por la pila recursiva