Programa de Python para invertir una lista vinculada en grupos de tamaño dado – Conjunto 1

Dada una lista enlazada, escribe una función para invertir cada k Node (donde k es una entrada a la función). 

Ejemplo: 

Entrada : 1->2->3->4->5->6->7->8->NULL, K = 3 
Salida : 3->2->1->6->5->4- >8->7->NULO 
Entrada : 1->2->3->4->5->6->7->8->NULO, K = 5 
Salida : 5->4->3-> 2->1->8->7->6->NULO 

Algoritmo : inverso (cabeza, k) 

  • Invierta la primera sublista de tamaño k. Mientras retrocede, realice un seguimiento del siguiente Node y del Node anterior. Deje que el puntero al siguiente Node sea next y el puntero al Node anterior sea prev . Consulte esta publicación para invertir una lista vinculada.
  • head->next = reverse(next, k) (Llama recursivamente al resto de la lista y vincula las dos sublistas)
  • Return prev ( prev se convierte en el nuevo encabezado de la lista (ver los diagramas de un método iterativo de esta publicación )

La siguiente imagen muestra cómo funciona la función inversa: 

A continuación se muestra la implementación del enfoque anterior:

Python

# Python program to reverse a 
# linked list in group of given size
  
# Node class
class Node:
  
    # Constructor to initialize the 
    # node object
    def __init__(self, data):
        self.data = data
        self.next = None
  
  
class LinkedList:
  
    # Function to initialize head
    def __init__(self):
        self.head = None
  
    def reverse(self, head, k):      
        if head == None:
          return None
        current = head
        next = None
        prev = None
        count = 0
  
        # Reverse first k nodes of the linked list
        while(current is not None and 
              count < k):
            next = current.next
            current.next = prev
            prev = current
            current = next
            count += 1
  
        # next is now a pointer to (k+1)th node
        # recursively call for the list starting
        # from current. And make rest of the list as
        # next of first node
        if next is not None:
            head.next = self.reverse(next, k)
  
        # prev is new head of the input list
        return prev
  
    # Function to insert a new node at 
    # the beginning
    def push(self, new_data):
        new_node = Node(new_data)
        new_node.next = self.head
        self.head = new_node
  
    # Utility function to print the 
    # Linked List
    def printList(self):
        temp = self.head
        while(temp):
            print temp.data,
            temp = temp.next
  
# Driver code
llist = LinkedList()
llist.push(9)
llist.push(8)
llist.push(7)
llist.push(6)
llist.push(5)
llist.push(4)
llist.push(3)
llist.push(2)
llist.push(1)
  
print "Given linked list"
llist.printList()
llist.head = llist.reverse(llist.head, 3)
  
print "Reversed Linked list"
llist.printList()
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

Producción: 

Given Linked List
1 2 3 4 5 6 7 8 9 
Reversed list
3 2 1 6 5 4 9 8 7 

Análisis de Complejidad: 

  • Complejidad temporal: O(n). 
    El recorrido de la lista se realiza solo una vez y tiene ‘n’ elementos.
  • Espacio Auxiliar: O(n/k). 
    Para cada Lista Enlazada de tamaño n, n/k o (n/k)+1 se realizarán llamadas durante la recursividad.

Consulte el artículo completo sobre Invertir una lista vinculada en grupos de tamaño determinado | ¡ Establezca 1 para más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *