Programa de Python para invertir una lista enlazada en grupos de tamaño dado – Conjunto 2

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

Input: 1->2->3->4->5->6->7->8->NULL and k = 3 
Output: 3->2->1->6->5->4->8->7->NULL. 

Input: 1->2->3->4->5->6->7->8->NULL and k = 5
Output: 5->4->3->2->1->8->7->6->NULL.

Ya hemos discutido su solución en la publicación a continuación 
Invertir una lista vinculada en grupos de tamaño dado | Conjunto 1
En esta publicación, hemos utilizado una pila que almacenará los Nodes de la lista vinculada dada. En primer lugar, inserte los k elementos de la lista enlazada en la pila. Ahora extraiga los elementos uno por uno y realice un seguimiento del Node previamente extraído. Apunte el puntero siguiente del Node anterior al elemento superior de la pila. Repita este proceso, hasta llegar a NULL.
Este algoritmo usa O(k) espacio adicional.

Python3

# Python3 program to reverse a Linked List
# in groups of given size
  
# Node class
class Node(object):
    __slots__ = 'data', 'next'
  
    # Constructor to initialize the 
    # node object
    def __init__(self, data = None, 
                 next = None):
        self.data = data
        self.next = next
  
    def __repr__(self):
        return repr(self.data)
  
class LinkedList(object):
  
    # Function to initialize head
    def __init__(self):
        self.head = None
  
    # Utility function to print 
    # nodes of LinkedList
    def __repr__(self):
        nodes = []
        curr = self.head
        while curr:
            nodes.append(repr(curr))
            curr = curr.next
        return '[' + ', '.join(nodes) + ']'
  
    # Function to insert a new node at
    # the beginning
    def prepend(self, data):
        self.head = Node(data = data,
                         next = self.head)
  
    # Reverses the linked list in groups 
    # of size k and returns the pointer 
    # to the new head node.
    def reverse(self, k = 1):
        if self.head is None:
            return
  
        curr = self.head
        prev = None
        new_stack = []
        while curr is not None:
            val = 0
              
            # Terminate the loop whichever 
            # comes first either current == None 
            # or value >= k
            while curr is not None and val < k:
                new_stack.append(curr.data)
                curr = curr.next
                val += 1
  
            # Now pop the elements of stack one 
            # by one
            while new_stack:
                  
                # If final list has not been 
                # started yet.
                if prev is None:
                    prev = Node(new_stack.pop())
                    self.head = prev
                else:
                    prev.next = Node(new_stack.pop())
                    prev = prev.next
                      
        # Next of last element will point to None.
        prev.next = None
        return self.head
  
# Driver Code
llist = LinkedList() 
llist.prepend(9)
llist.prepend(8)
llist.prepend(7)
llist.prepend(6)
llist.prepend(5)
llist.prepend(4)
llist.prepend(3)
llist.prepend(2)
llist.prepend(1)
  
print("Given linked list")
print(llist)
llist.head = llist.reverse(3)
  
print("Reversed Linked list")
print(llist)
# This code is contributed by Sagar Kumar Sinha(sagarsinha7777)

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

Consulte el artículo completo sobre Invertir una lista vinculada en grupos de tamaño determinado | Set 2 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 *