【Pregunta diaria】 19. Quitar el nodo N del final de la lista

Inserte la descripción de la imagen aquí

El título significa que solo se le permite atravesar una vez y eliminar el n-ésimo nodo de la parte inferior de la lista vinculada. Según el significado del título, debe comenzar a contar desde 1.

Utilizando el método de doble puntero, para ser precisos, no se atraviesa estrictamente una vez, después de todo, el segundo puntero viajará una cierta distancia.

La idea del algoritmo es configurar dos punteros, primero deje que el primer puntero vaya n pasos, luego los dos punteros vayan juntos y, finalmente, la posición a la que apunta el segundo puntero es el nodo anterior del nodo que se va a eliminar. Hay una situación especial a considerar aquí, y también es algo que no noté cuando lo escribí por primera vez. Si n es igual a la longitud de la lista vinculada, el primer puntero irá al puntero nulo detrás del nodo de cola si toma n pasos. , Se informará un error durante while (p.next), porque el puntero nulo no tiene el atributo siguiente. Si n es menor que la longitud de la lista vinculada, entonces dejamos que los dos punteros vayan juntos hasta el final de la lista vinculada

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        p = head
        q = head
        for i in range(0, n):
            p = p.next
        if not p:
            return head.next    #当n等于链表长度的时候,p为空,直接返回head.next
        while(p.next):
            p = p.next
            q = q.next
        q.next = q.next.next
        return head

Supongo que te gusta

Origin blog.csdn.net/SJTUKK/article/details/109141830
Recomendado
Clasificación