Invertir una lista enlazada en grupos de tamaño determinado | 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: 

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

Inputs:   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 enlazada 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 siguiente puntero del Node anterior al elemento superior de la pila. Repita este proceso, hasta llegar a NULL.
Este algoritmo usa O(k) espacio adicional. 
 

 

Complete Interview Preparation - GFG

Implementación:

C++

// C++ program to reverse a linked list in groups
// of given size
#include <bits/stdc++.h>
using namespace std;
 
/* Link list node */
struct Node {
    int data;
    struct Node* next;
};
 
/* Reverses the linked list in groups of size k
   and returns the pointer to the new head node. */
struct Node* Reverse(struct Node* head, int k)
{
    // Create a stack of Node*
    stack<Node*> mystack;
    struct Node* current = head;
    struct Node* prev = NULL;
 
    while (current != NULL) {
 
        // Terminate the loop whichever comes first
        // either current == NULL or count >= k
        int count = 0;
        while (current != NULL && count < k) {
            mystack.push(current);
            current = current->next;
            count++;
        }
 
        // Now pop the elements of stack one by one
        while (mystack.size() > 0) {
 
            // If final list has not been started yet.
            if (prev == NULL) {
                prev = mystack.top();
                head = prev;
                mystack.pop();
            } else {
                prev->next = mystack.top();
                prev = prev->next;
                mystack.pop();
            }
        }
    }
 
    // Next of last element will point to NULL.
    prev->next = NULL;
 
    return head;
}
 
/* UTILITY FUNCTIONS */
/* Function to push a node */
void push(struct Node** head_ref, int new_data)
{
    /* allocate node */
    struct Node* new_node =
          (struct Node*)malloc(sizeof(struct Node));
 
    /* put in the data  */
    new_node->data = new_data;
 
    /* link the old list off the new node */
    new_node->next = (*head_ref);
 
    /* move the head to point to the new node */
    (*head_ref) = new_node;
}
 
/* Function to print linked list */
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d  ", node->data);
        node = node->next;
    }
}
 
/* Driver program to test above function*/
int main(void)
{
    /* Start with the empty list */
    struct Node* head = NULL;
 
    /* Created Linked list is 1->2->3->4->5->6->7->8->9 */
    push(&head, 9);
    push(&head, 8);
    push(&head, 7);
    push(&head, 6);
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
 
    printf("\nGiven linked list \n");
    printList(head);
    head = Reverse(head, 3);
 
    printf("\nReversed Linked list \n");
    printList(head);
 
    return 0;
}

Java

// Java program to reverse a linked list in groups
// of given size
import java.util.*;
class GfG
{
     
/* Link list node */
static class Node
{
    int data;
    Node next;
}
static Node head = null;
 
/* Reverses the linked list in groups of size k
and returns the pointer to the new head node. */
static Node Reverse(Node head, int k)
{
    // Create a stack of Node*
    Stack<Node> mystack = new Stack<Node> ();
    Node current = head;
    Node prev = null;
 
    while (current != null)
    {
 
        // Terminate the loop whichever comes first
        // either current == NULL or count >= k
        int count = 0;
        while (current != null && count < k)
        {
            mystack.push(current);
            current = current.next;
            count++;
        }
 
        // Now pop the elements of stack one by one
        while (mystack.size() > 0)
        {
 
            // If final list has not been started yet.
            if (prev == null)
            {
                prev = mystack.peek();
                head = prev;
                mystack.pop();
            }
            else
            {
                prev.next = mystack.peek();
                prev = prev.next;
                mystack.pop();
            }
        }
    }
 
    // Next of last element will point to NULL.
    prev.next = null;
 
    return head;
}
 
/* UTILITY FUNCTIONS */
/* Function to push a node */
static void push( int new_data)
{
    /* allocate node */
    Node new_node = new Node();
 
    /* put in the data */
    new_node.data = new_data;
 
    /* link the old list off the new node */
    new_node.next = head;
 
    /* move the head to point to the new node */
    head = new_node;
}
 
/* Function to print linked list */
static void printList(Node node)
{
    while (node != null)
    {
        System.out.print(node.data + " ");
        node = node.next;
    }
}
 
/* Driver code*/
public static void main(String[] args)
{
    /* Start with the empty list */
    //Node head = null;
 
    /* Created Linked list is 1->2->3->
    4->5->6->7->8->9 */
    push( 9);
    push( 8);
    push( 7);
    push( 6);
    push( 5);
    push(4);
    push(3);
    push(2);
    push( 1);
 
    System.out.println("Given linked list ");
    printList(head);
    head = Reverse(head, 3);
    System.out.println();
 
    System.out.println("Reversed Linked list ");
    printList(head);
}
}
 
// This code is contributed by Prerna Saini

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)

C#

// C# program to reverse a linked list 
// in groups of given size
using System;
using System.Collections;
 
class GfG
{
     
/* Link list node */
public class Node
{
    public int data;
    public Node next;
}
static Node head = null;
 
/* Reverses the linked list in groups of size k
and returns the pointer to the new head node. */
static Node Reverse(Node head, int k)
{
    // Create a stack of Node*
    Stack mystack = new Stack();
    Node current = head;
    Node prev = null;
 
    while (current != null)
    {
 
        // Terminate the loop whichever comes first
        // either current == NULL or count >= k
        int count = 0;
        while (current != null && count < k)
        {
            mystack.Push(current);
            current = current.next;
            count++;
        }
 
        // Now Pop the elements of stack one by one
        while (mystack.Count > 0)
        {
 
            // If final list has not been started yet.
            if (prev == null)
            {
                prev = (Node)mystack.Peek();
                head = prev;
                mystack.Pop();
            }
            else
            {
                prev.next = (Node)mystack.Peek();
                prev = prev.next;
                mystack.Pop();
            }
        }
    }
 
    // Next of last element will point to NULL.
    prev.next = null;
 
    return head;
}
 
/* UTILITY FUNCTIONS */
/* Function to Push a node */
static void Push( int new_data)
{
    /* allocate node */
    Node new_node = new Node();
 
    /* put in the data */
    new_node.data = new_data;
 
    /* link the old list off the new node */
    new_node.next = head;
 
    /* move the head to point to the new node */
    head = new_node;
}
 
/* Function to print linked list */
static void printList(Node node)
{
    while (node != null)
    {
        Console.Write(node.data + " ");
        node = node.next;
    }
}
 
/* Driver code*/
public static void Main(String []args)
{
    /* Start with the empty list */
    //Node head = null;
 
    /* Created Linked list is 1->2->3->
    4->5->6->7->8->9 */
    Push( 9);
    Push( 8);
    Push( 7);
    Push( 6);
    Push( 5);
    Push(4);
    Push(3);
    Push(2);
    Push( 1);
 
    Console.WriteLine("Given linked list ");
    printList(head);
    head = Reverse(head, 3);
    Console.WriteLine();
 
    Console.WriteLine("Reversed Linked list ");
    printList(head);
}
}
 
// This code is contributed by Arnab Kundu

Javascript

<script>
// javascript program to reverse a linked list in groups
// of given size class GfG {
 
    /* Link list node */
class Node {
    constructor() {
        this.data = 0;
        this.next = null;
    }
}
 
    var head = null;
 
    /*
     * Reverses the linked list in groups of size k and returns the pointer to the
     * new head node.
     */
    function Reverse(head , k) {
        // Create a stack of Node*
        var mystack = [];
var current = head;
var prev = null;
 
        while (current != null) {
 
            // Terminate the loop whichever comes first
            // either current == NULL or count >= k
            var count = 0;
            while (current != null && count < k) {
                mystack.push(current);
                current = current.next;
                count++;
            }
 
            // Now pop the elements of stack one by one
            while (mystack.length > 0) {
 
                // If final list has not been started yet.
                if (prev == null) {
                    prev = mystack.pop();
                    head = prev;
                     
                } else {
                    prev.next = mystack.pop();
                    prev = prev.next;
                     
                }
            }
        }
 
        // Next of last element will point to NULL.
        prev.next = null;
 
        return head;
    }
 
    /* UTILITY FUNCTIONS */
    /* Function to push a node */
    function push(new_data) {
        /* allocate node */
var new_node = new Node();
 
        /* put in the data */
        new_node.data = new_data;
 
        /* link the old list off the new node */
        new_node.next = head;
 
        /* move the head to point to the new node */
        head = new_node;
    }
 
    /* Function to print linked list */
    function printList(node) {
        while (node != null) {
            document.write(node.data + " ");
            node = node.next;
        }
    }
 
    /* Driver code */
     
        /* Start with the empty list */
        // Node head = null;
 
        /*
         * Created Linked list is 1->2->3-> 4->5->6->7->8->9
         */
        push(9);
        push(8);
        push(7);
        push(6);
        push(5);
        push(4);
        push(3);
        push(2);
        push(1);
 
        document.write("Given linked list <br/>");
        printList(head);
        head = Reverse(head, 3);
        document.write("<br/>");
 
        document.write("Reversed Linked list <br/>");
        printList(head);
 
// This code contributed by aashish1995
</script>
Producción

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

Complejidad del tiempo: O(N) , ya que estamos usando un bucle para atravesar N veces. Donde N es el número de Nodes en la lista enlazada.
Espacio auxiliar: O(k) , ya que estamos usando espacio adicional para la pila.

Este artículo es una contribución de Jatin Goyal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. 

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 *