Título : Introduzca una lista enlazada, la lista enlazada recíproco de salida k-ésimo nodo, con el fin de cumplir con la costumbre de la mayoría de la gente, esta pregunta empieza a contar desde el 1, es decir, al final de la lista de nodos es el inverso del primer nodo. Por ejemplo, una lista vinculada tiene 6 nodos, comenzando desde el nodo principal, sus valores son 1, 2, 3, 4, 5, 6. El penúltimo nodo de esta lista vinculada es un nodo con un valor de 4.
Ejemplo : entrada 1-> 2-> 3-> 4-> 5 yk = 2; salida: 4-> 5
Sitio de prueba : robustez del código
Algoritmo : 1. Inicialización : puntero delantero anterior, puntero trasero más tarde; ambos punteros apuntan al nodo principal
2. Construya una distancia de puntero doble : el puntero frontal se mueve hacia adelante por k-1 pasos.
3. Movimiento de doble puntero : desde el paso k, los dos punteros avanzan juntos hasta que el primero apunta al nodo de cola.
4. Valor de retorno : solo regrese más tarde.
Complejidad de tiempo O (N): N es la longitud de la lista vinculada, la primera avanza en N-1 pasos y la segunda avanza en Nk pasos.
Complejidad espacial O (1): formador de doble puntero, este último utiliza espacio de tamaño constante.
De acuerdo con el algoritmo anterior, podemos escribir el siguiente código:
# Definición de lista individualmente vinculada. # class ListNode: # def __init __ (self, x): # self.val = x # self.next = None class Solución: def getKthFromEnd (self, head: ListNode, k: int) -> ListNode: former = later = head para _ en el rango (k-1 ): former = former.next mientras former.next: later , former = later.next, former.next devuelve este último
Pero la solidez del código anterior no es suficiente, hay tres problemas:
- La lista vinculada está vacía. Debido a que el código accederá a la memoria señalada por el puntero nulo, haciendo que el programa se bloquee
- El parámetro de entrada k = 0; también hará que el programa se bloquee
- El número de nodos en la lista vinculada es menor que k. También existe el problema de acceder a la memoria señalada por el puntero nulo y hacer que el programa se bloquee;
Mejora el código:
# Definición de lista individualmente vinculada. # class ListNode: # def __init __ (self, x): # self.val = x # self.next = None class Solución: def getKthFromEnd (self, head: ListNode, k: int) -> ListNode: # 空 链表 si no head: return head # k = 0 si k == 0: return None former = later = head for _ in range (k-1): # K>链表长度 si former.next es no Ninguno: ex = former.next otra cosa : el retorno Ninguno mientras former.next: este último, ex = latter.next, former.next retorno última