Invierta una lista enlazada individual en grupos de tamaño determinado | conjunto 3

Dada una lista enlazada individualmente y un número entero K , la tarea es invertir todos los Nodes K ​​de la lista enlazada dada.

Ejemplos: 

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

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

Enfoque: Se han discutido dos enfoques diferentes para resolver este problema en el Conjunto 1 y el Conjunto 2 de este artículo. En este artículo, se discutirá  un enfoque basado en deque .

  1. Crea un deque.
  2. Almacene la dirección de los primeros k Nodes en el deque.
  3. Extraiga el primero y el último valor de la deque e intercambie los valores de datos en esas direcciones.
  4. Repita el paso 3 hasta que el deque no esté vacío.
  5. Repita el paso 2 para los siguientes k Nodes y hasta que no llegue al final de la lista enlazada.

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

C++14

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Link list node
struct node {
    int data;
    struct node* next;
};
 
// Function to insert a node at
// the head of the linked list
void push(node** head_ref, 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_ref);
 
    /* Move the head to point to the new node */
    (*head_ref) = new_node;
}
 
// Function to print the linked list
void printList(node* head)
{
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
}
 
/* Function to reverse the linked list in groups of
size k and return the pointer to the new head node. */
struct node* reverse(struct node* head, int k)
{
 
    if (head == NULL)
        return head;
 
    // Create deque to store the address
    // of the nodes of the linked list
    deque<node*> q;
 
    // Store head pointer in current to
    // traverse the linked list
    node* current = head;
    int i;
 
    // Iterate through the entire linked
    // list by moving the current
    while (current != NULL) {
        i = 1;
 
        // Store addresses of the k
        // nodes in the deque
        while (i <= k) {
            if (current == NULL)
                break;
            q.push_back(current);
            current = current->next;
            i++;
        }
 
        /* pop first and the last value from
        the deque and swap the data values at
        those addresses
        Do this till there exist an address in
        the deque or deque is not empty*/
        while (!q.empty()) {
            node* front = q.front();
            node* last = q.back();
            swap(front->data, last->data);
 
            // pop from the front if
            // the deque is not empty
            if (!q.empty())
                q.pop_front();
 
            // pop from the back if
            // the deque is not empty
            if (!q.empty())
                q.pop_back();
        }
    }
    return head;
}
 
// Driver code
int main()
{
 
    // Start with the empty list
    node* head = NULL;
 
    // Created Linked list is
    // 1->2->3->4->5->6->7->8->9->10
    push(&head, 10);
    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);
 
    int k = 2;
 
    // Get the new head after reversing the
    // linked list in groups of size k
    head = reverse(head, k);
 
    printList(head);
 
    return 0;
}

Java

// Java implementation of the above approach
import java.util.*;
 
class LinkedList{
 
static Node head;
 
// Creating node class
static class Node
{
    int data;
    Node next;
 
    Node(int d)
    {
        data = d;
        next = null;
    }
}
 
// Inserts a new Node at front of the list.
public void push(int new_data)
{
 
    // Allocate the Node &
    // Put in the data
    Node new_node = new Node(new_data);
 
    // Make next of new Node as head
    new_node.next = head;
 
    // Move the head to point to new Node
    head = new_node;
}
 
// Prints content of linked list
void printList(Node node)
{
    while (node != null)
    {
        System.out.print(node.data + " ");
        node = node.next;
    }
}
 
// Function to reverse the linked list
// in groups of size k and return the
// pointer to the new head node.
Node reverse(Node head, int k)
{
    if (head == null)
        return head;
     
    // Create deque to store the address
    // of the nodes of the linked list
    Deque<Node> q = new ArrayDeque<Node>();
     
    // Store head pointer in current to
    // traverse the linked list
    Node current = head;
    int i;
     
    // Iterate through the entire linked
    // list by moving the current
    while (current != null)
    {
        i = 1;
         
        // Store addresses of the k
        // nodes in the deque
        while (i <= k)
        {
            if (current == null)
                break;
                 
            q.addLast(current);
            current = current.next;
            i++;
        }
         
        // pop first and the last value from
        // the deque and swap the data values at
        // those addresses
        // Do this till there exist an address in
        // the deque or deque is not empty
        while (!q.isEmpty())
        {
            Node front = q.peekFirst();
            Node last = q.peekLast();
             
            // Swapping front and
            // last nodes
            int temp = front.data;
            front.data = last.data;
            last.data = temp;
             
            // pop from the front if
            // the deque is not empty
            if (!q.isEmpty())
                q.removeFirst();
         
            // pop from the back if
            // the deque is not empty
            if (!q.isEmpty())
                q.removeLast();
        }
    }
    return head;
}
 
// Driver code
public static void main(String[] args)
{
    LinkedList list = new LinkedList();
 
    // Created Linked list is
    // 1->2->3->4->5->6->7->8->9->10
    list.push(10);
    list.push(9);
    list.push(8);
    list.push(7);
    list.push(6);
    list.push(5);
    list.push(4);
    list.push(3);
    list.push(2);
    list.push(1);
     
    int k = 2;
 
    // Get the new head after reversing the
    // linked list in groups of size k
    head = list.reverse(head, k);
    list.printList(head);
}
}
 
// This code is contributed by Bindu Madhav

Python3

# Python3 implementation of the approach
 
# Link list node
class Node:
    def __init__(self):
        self.data = 0
        self.next = None
 
# Function to insert a node at
# the head of the linked list
def push(head_ref, new_data):
 
    # Allocate node
    new_node = 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
    return head_ref
 
# Function to print the linked list
def printList( head):
 
    while (head != None) :
        print( head.data, end = " ")
        head = head.next
     
# Function to reverse the linked list in groups of
# size k and return the pointer to the new head node.
def reverse( head, k):
 
    if (head == None):
        return head
 
    # Create deque to store the address
    # of the nodes of the linked list
    q = []
 
    # Store head pointer in current to
    # traverse the linked list
    current = head
    i = 0
 
    # Iterate through the entire linked
    # list by moving the current
    while (current != None) :
        i = 1
 
        # Store addresses of the k
        # nodes in the deque
        while (i <= k) :
            if (current == None):
                break
            q.append(current)
            current = current.next
            i = i + 1
         
        # pop first and the last value from
        # the deque and swap the data values at
        # those addresses
        # Do this till there exist an address in
        # the deque or deque is not empty
        while (len(q) > 0):
            front = q[-1]
            last = q[0]
             
            temp = front.data
            front.data = last.data
            last.data = temp
 
            # pop from the front if
            # the deque is not empty
            if (len(q) > 0):
                q.pop()
 
            # pop from the back if
            # the deque is not empty
            if (len(q)):
                q.pop(0)
     
    return head
 
# Driver code
 
# Start with the empty list
head = None
 
# Created Linked list is
# 1.2.3.4.5.6.7.8.9.10
head = push(head, 10)
head = push(head, 9)
head = push(head, 8)
head = push(head, 7)
head = push(head, 6)
head = push(head, 5)
head = push(head, 4)
head = push(head, 3)
head = push(head, 2)
head = push(head, 1)
 
k = 2
 
# Get the new head after reversing the
# linked list in groups of size k
head = reverse(head, k)
printList(head)
 
# This code is contributed by Arnab Kundu

C#

// C# implementation of the above approach
using System;
using System.Collections.Generic;
 
class List{
 
static Node head;
 
// Creating node class
class Node
{
    public int data;
    public Node next;
 
    public Node(int d)
    {
        data = d;
        next = null;
    }
}
 
// Inserts a new Node at front of the list.
public void Push(int new_data)
{
 
    // Allocate the Node &
    // Put in the data
    Node new_node = new Node(new_data);
 
    // Make next of new Node as head
    new_node.next = head;
 
    // Move the head to point to new Node
    head = new_node;
}
 
// Prints content of linked list
void printList(Node node)
{
    while (node != null)
    {
        Console.Write(node.data + " ");
        node = node.next;
    }
}
 
// Function to reverse the linked list
// in groups of size k and return the
// pointer to the new head node.
Node reverse(Node head, int k)
{
    if (head == null)
        return head;
     
    // Create deque to store the address
    // of the nodes of the linked list
    List<Node> q = new List<Node>();
     
    // Store head pointer in current to
    // traverse the linked list
    Node current = head;
    int i;
     
    // Iterate through the entire linked
    // list by moving the current
    while (current != null)
    {
        i = 1;
         
        // Store addresses of the k
        // nodes in the deque
        while (i <= k)
        {
            if (current == null)
                break;
               
            q.Add(current);
            current = current.next;
            i++;
        }
         
        // pop first and the last value from
        // the deque and swap the data values at
        // those addresses
        // Do this till there exist an address in
        // the deque or deque is not empty
        while (q.Count != 0)
        {
            Node front = q[0];
            Node last = q[q.Count - 1];
             
            // Swapping front and
            // last nodes
            int temp = front.data;
            front.data = last.data;
            last.data = temp;
             
            // pop from the front if
            // the deque is not empty
            if (q.Count != 0)
                q.RemoveAt(0);
         
            // pop from the back if
            // the deque is not empty
            if (q.Count != 0)
               q.RemoveAt(q.Count - 1);
        }
    }
    return head;
}
 
// Driver code
public static void Main(String[] args)
{
    List list = new List();
 
    // Created Linked list is
    // 1->2->3->4->5->6->7->8->9->10
    list.Push(10);
    list.Push(9);
    list.Push(8);
    list.Push(7);
    list.Push(6);
    list.Push(5);
    list.Push(4);
    list.Push(3);
    list.Push(2);
    list.Push(1);
     
    int k = 2;
 
    // Get the new head after reversing the
    // linked list in groups of size k
    head = list.reverse(head, k);
    list.printList(head);
}
}
 
// This code is contributed by todaysgaurav

Javascript

<script>
 
// Javascript implementation of the above approach
var head = null;
 
// Creating node class
class Node
{
    constructor(d)
    {
        this.data = d;
        this.next = null;
    }
}
 
// Inserts a new Node at front of the list.
function Push(new_data)
{
     
    // Allocate the Node &
    // Put in the data
    var new_node = new Node(new_data);
 
    // Make next of new Node as head
    new_node.next = head;
 
    // Move the head to point to new Node
    head = new_node;
}
 
// Prints content of linked list
function printList(node)
{
    while (node != null)
    {
        document.write(node.data + " ");
        node = node.next;
    }
}
 
// Function to reverse the linked list
// in groups of size k and return the
// pointer to the new head node.
function reverse(head, k)
{
    if (head == null)
        return head;
     
    // Create deque to store the address
    // of the nodes of the linked list
    var q = [];
     
    // Store head pointer in current to
    // traverse the linked list
    var current = head;
    var i;
     
    // Iterate through the entire linked
    // list by moving the current
    while (current != null)
    {
        i = 1;
         
        // Store addresses of the k
        // nodes in the deque
        while (i <= k)
        {
            if (current == null)
                break;
               
            q.push(current);
            current = current.next;
            i++;
        }
         
        // pop first and the last value from
        // the deque and swap the data values at
        // those addresses
        // Do this till there exist an address in
        // the deque or deque is not empty
        while (q.length != 0)
        {
            var front = q[0];
            var last = q[q.length - 1];
             
            // Swapping front and
            // last nodes
            var temp = front.data;
            front.data = last.data;
            last.data = temp;
             
            // pop from the front if
            // the deque is not empty
            if (q.Count != 0)
                q.shift();
         
            // pop from the back if
            // the deque is not empty
            if (q.Count != 0)
               q.pop();
        }
    }
    return head;
}
 
// Driver code
 
// Created Linked list is
// 1->2->3->4->5->6->7->8->9->10
Push(10);
Push(9);
Push(8);
Push(7);
Push(6);
Push(5);
Push(4);
Push(3);
Push(2);
Push(1);
 
var k = 2;
 
// Get the new head after reversing the
// linked list in groups of size k
head = reverse(head, k);
printList(head);
 
// This code is contributed by itsok
 
</script>
Producción:

2 1 4 3 6 5 8 7 10 9 

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por Rohit_Dwivedi 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 *