Conjunto de problemas de LeetCode: lista enlazada (3)

Este artículo presenta el problema de la lista enlazada en el conjunto de problemas de LeetCode.

Otras preguntas de LeetCode sobre listas enlazadas:
Conjunto de problemas de LeetCode: Lista enlazada (1)
Conjunto de problemas de LeetCode: Lista enlazada (2)


19. Eliminar el nodo N del final de la lista (eliminar el último nodo N de la lista vinculada)


Descripción del problema

LeetCode 19 Descripción del problema

idea y codigo


Hay dos soluciones para este problema.

Primero, primero puede atravesar la lista para determinar la longitud y luego hacer otro recorrido para eliminar el nodo N de la parte inferior.

el código se muestra a continuación:

# 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:
        dummy = ListNode(val=-1, next=head)
        num_node = 0  # number of nodes
        while head:
            num_node += 1
            head = head.next

        res = dummy
        head = dummy
        while head.next:
            if num_node == n:
                head.next = head.next.next
                break
            else:
                num_node -= 1
                head = head.next

        res = res.next

        return res

resultado de ejecución:
LeetCode 19 Efecto de ejecución 1

En segundo lugar, el método de puntero rápido y lento, primero mueva el puntero rápido N pasos y luego mueva los punteros rápido y lento al mismo tiempo. Cuando el puntero rápido se mueve hasta el final, el puntero lento está en la parte inferior N + 1 nodo, y su siguiente punto apunta al nodo inferior N-1 (siguiente siguiente nodo) es suficiente.

el código se muestra a continuación:

# 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:
        fast, slow = head, head
        
        # move fast n steps in advance
        for i in range(n):
            fast = fast.next

        # special case: remove the 1st node
        if not fast:
            return head.next

        # move fast and slow together
        while fast.next:
            fast = fast.next
            slow = slow.next
        slow.next = slow.next.next  # remove the nth node from the end

        return head

resultado de ejecución:
LeetCode 19 efecto de ejecución 2


203. Eliminar elementos de la lista enlazada


Descripción del problema

LeetCode 203 Descripción del problema

idea y codigo


La idea de esta pregunta es simple, recorrer los nodos uno por uno y modificar el siguiente parámetro del nodo anterior para el nodo que se debe eliminar.

el código se muestra a continuación:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(val=-1, next=head)
        head = dummy
        while head.next:
            if head.next.val == val:
                head.next = head.next.next
            else:
                head = head.next

        res = dummy.next

        return res

resultado de ejecución:
Efecto de ejecución LeetCode 203


61. Rotar lista


Descripción del problema

LeetCode 61 Descripción del problema I
LeetCode 61 Descripción del problema II

idea y codigo


La idea de esta pregunta es observar el resultado de la rotación de la lista enlazada, se puede ver que la rotación es equivalente a cortar la lista enlazada en dos segmentos y luego volver a unirlos. La posición de corte se puede determinar por el número de rotaciones k, y luego modificar el siguiente parámetro del nodo correspondiente.

Tenga en cuenta dos casos especiales:

  • Cuando la lista enlazada está vacía, vuelve directamente a la lista enlazada vacía original
  • Calcule el resto del número de rotaciones k a la longitud de la lista enlazada, si el resultado es 0, regrese a la lista enlazada original

el código se muestra a continuación:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head:
            return head

        dummy = ListNode(val=-1, next=head)

        num_node = 0
        head = dummy
        while head.next:
            num_node += 1
            head = head.next

        # in case: k > num_node
        k %= num_node

        if not k:
            return dummy.next

        head_ori = dummy.next  # original head
        head = dummy.next
        for _ in range(num_node - k):
            head = head.next
        dummy.next = head  # new head
        for _ in range(k - 1):
            head = head.next
        head.next = head_ori  # next node of tail -> original head
        for _ in range(num_node - k):
            head = head.next
        head.next = None

        return dummy.next

resultado de ejecución:
LeetCode 61 Efecto de ejecución 1

La solución oficial del problema da otra forma de pensar.Primero, la lista enlazada se forma en un anillo, y luego se encuentra la posición del nodo correspondiente de acuerdo con el número de rotaciones k para resolver el anillo.

Solución oficial LeetCode 61

el código se muestra a continuación:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head or not head.next:
            return head
        
        n = 1  # number of nodes
        cur = head
        while cur.next:
            cur = cur.next
            n += 1
        
        k %= n  # k < n
        if not k:
            return head
        
        cur.next = head
        for _ in range(n - k):
            cur = cur.next
        
        res = cur.next
        cur.next = None  # break the loop

        return res

resultado de ejecución:
LeetCode 61 Efecto de ejecución 2

Supongo que te gusta

Origin blog.csdn.net/Zhang_0702_China/article/details/121244241
Recomendado
Clasificación