Dedo de espada: el penúltimo nodo k-ésimo en la lista vinculada

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:

  1. 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
  2. El parámetro de entrada k = 0; también hará que el programa se bloquee
  3. 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

 

Supongo que te gusta

Origin www.cnblogs.com/aniu-caili/p/12749957.html
Recomendado
Clasificación