Mover los últimos m elementos al frente de una Lista Vinculada dada

Dada la cabeza de una lista enlazada individualmente y un valor m , la tarea es mover los últimos m elementos al frente. 
Ejemplos: 
 

Entrada: 4->5->6->1->2->3 ; m = 3 
Salida: 1->2->3->4->5->6
Entrada: 0->1->2->3->4->5 ; m = 4 
Salida: 2->3->4->5->0->1 
 

Algoritmo: 
 

  1. Utilice dos punteros: uno para almacenar la dirección del último Node y otro para la dirección del primer Node.
  2. Recorra la lista hasta el primer Node de los últimos m Nodes.
  3. Mantenga dos punteros p, q, es decir, p como el primer Node de los últimos m Nodes y q justo antes del Node de p.
  4. Haga que el último Node sea el siguiente como el encabezado de la lista original.
  5. Haga que el siguiente Node q sea NULL.
  6. Establezca la p como la cabeza.

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

C++

// C++ Program to move last m elements
// to front in a given linked list
#include <iostream>
using namespace std;
 
// A linked list node
struct Node
{
    int data;
    struct Node* next;
} * first, *last;
 
int length = 0;
 
// Function to print nodes
// in a given linked list
void printList(struct Node* node)
{
    while (node != NULL)
    {
        cout << node->data <<" ";
        node = node->next;
    }
}
 
// Pointer head and p are being
// used here because, the head
// of the linked list is changed in this function.
void moveToFront(struct Node* head,
                struct Node* p, int m)
{
    // If the linked list is empty,
    // or it contains only one node,
    // then nothing needs to be done, simply return
    if (head == NULL)
        return;
 
    p = head;
    head = head->next;
    m++;
 
    // if m value reaches length,
    // the recursion will end
    if (length == m)
    {
 
        // breaking the link
        p->next = NULL;
 
        // connecting last to first &
        // will make another node as head
        last->next = first;
 
        // Making the first node of
        // last m nodes as root
        first = head;
    }
    else
        moveToFront(head, p, m);
}
 
// UTILITY FUNCTIONS
 
// Function to add a node at
// the beginning of Linked List
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;
 
    // making first & last nodes
    if (length == 0)
        last = *head_ref;
    else
        first = *head_ref;
 
    // increase the length
    length++;
}
 
// Driver code
int main()
{
    struct Node* start = NULL;
 
    // The constructed linked list is:
    // 1->2->3->4->5
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
    push(&start, 0);
 
    cout << "Initial Linked list\n";
    printList(start);
    int m = 4; // no.of nodes to change
    struct Node* temp;
    moveToFront(start, temp, m);
 
    cout << "\n Final Linked list\n";
    start = first;
    printList(start);
 
    return 0;
}
 
// This code is contributed by SHUBHAMSINGH10

C

// C Program to move last m elements
// to front in a given linked list
#include <stdio.h>
#include <stdlib.h>
 
// A linked list node
struct Node {
    int data;
    struct Node* next;
} * first, *last;
 
int length = 0;
 
// Function to print nodes
// in a given linked list
void printList(struct Node* node)
{
    while (node != NULL) {
        printf("%d ", node->data);
        node = node->next;
    }
}
 
// Pointer head and p are being
// used here because, the head
// of the linked list is changed in this function.
void moveToFront(struct Node* head,
                 struct Node* p, int m)
{
    // If the linked list is empty,
    // or it contains only one node,
    // then nothing needs to be done, simply return
    if (head == NULL)
        return;
 
    p = head;
    head = head->next;
    m++;
 
    // if m value reaches length,
    // the recursion will end
    if (length == m) {
 
        // breaking the link
        p->next = NULL;
 
        // connecting last to first &
        // will make another node as head
        last->next = first;
 
        // Making the first node of
        // last m nodes as root
        first = head;
    }
    else
        moveToFront(head, p, m);
}
 
// UTILITY FUNCTIONS
 
// Function to add a node at
// the beginning of Linked List
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;
 
    // making first & last nodes
    if (length == 0)
        last = *head_ref;
    else
        first = *head_ref;
 
    // increase the length
    length++;
}
 
// Driver code
int main()
{
    struct Node* start = NULL;
 
    // The constructed linked list is:
    // 1->2->3->4->5
    push(&start, 5);
    push(&start, 4);
    push(&start, 3);
    push(&start, 2);
    push(&start, 1);
    push(&start, 0);
 
    printf("\n Initial Linked list\n");
    printList(start);
    int m = 4; // no.of nodes to change
    struct Node* temp;
    moveToFront(start, temp, m);
 
    printf("\n Final Linked list\n");
    start = first;
    printList(start);
 
    return 0;
}

Java

// Java Program to move last m elements
// to front in a given linked list
class GFG
{
    // A linked list node
    static class Node
    {
        int data;
        Node next;
    }
 
    static Node first, last;
 
    static int length = 0;
 
    // Function to print nodes
    // in a given linked list
    static void printList(Node node)
    {
        while (node != null)
        {
            System.out.printf("%d ", node.data);
            node = node.next;
        }
    }
 
    // Pointer head and p are being
    // used here because, the head
    // of the linked list is changed in this function.
    static void moveToFront(Node head, Node p, int m)
    {
        // If the linked list is empty,
        // or it contains only one node,
        // then nothing needs to be done, simply return
        if (head == null)
            return;
 
        p = head;
        head = head.next;
        m++;
 
        // if m value reaches length,
        // the recursion will end
        if (length == m)
        {
 
            // breaking the link
            p.next = null;
 
            // connecting last to first &
            // will make another node as head
            last.next = first;
 
            // Making the first node of
            // last m nodes as root
            first = head;
        }
        else
            moveToFront(head, p, m);
    }
 
    // UTILITY FUNCTIONS
 
    // Function to add a node at
    // the beginning of Linked List
    static Node 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;
 
        // making first & last nodes
        if (length == 0)
            last = head_ref;
        else
            first = head_ref;
 
        // increase the length
        length++;
        return head_ref;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        Node start = null;
 
        // The constructed linked list is:
        // 1.2.3.4.5
        start = push(start, 5);
        start = push(start, 4);
        start = push(start, 3);
        start = push(start, 2);
        start = push(start, 1);
        start = push(start, 0);
 
        System.out.printf("\n Initial Linked list\n");
        printList(start);
        int m = 4; // no.of nodes to change
        Node temp = new Node();
        moveToFront(start, temp, m);
 
        System.out.printf("\n Final Linked list\n");
        start = first;
        printList(start);
    }
}
 
// This code is contributed by 29AjayKumar

Python3

# Python Program to move last m elements
# to front in a given linked list
 
# A linked list node
class Node :
    def __init__(self):
        self.data = 0
        self.next = None
         
first = None
last = None
 
length = 0
 
# Function to print nodes
# in a given linked list
def printList( node):
 
    while (node != None) :
        print( node.data, end=" ")
        node = node.next
     
# Pointer head and p are being
# used here because, the head
# of the linked list is changed in this function.
def moveToFront( head, p, m):
     
    global first
    global last
    global length
     
    # If the linked list is empty,
    # or it contains only one node,
    # then nothing needs to be done, simply return
    if (head == None):
        return head
 
    p = head
    head = head.next
    m= m + 1
 
    # if m value reaches length,
    # the recursion will end
    if (length == m) :
     
        # breaking the link
        p.next = None
 
        # connecting last to first &
        # will make another node as head
        last.next = first
         
        # Making the first node of
        # last m nodes as root
        first = head
     
    else:
        moveToFront(head, p, m)
         
# UTILITY FUNCTIONS
 
# Function to add a node at
# the beginning of Linked List
def push( head_ref, new_data):
     
    global first
    global last
    global length
     
    # 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
     
    # making first & last nodes
    if (length == 0):
        last = head_ref
    else:
        first = head_ref
 
    # increase the length
    length= length + 1
     
    return head_ref
 
# Driver code
 
start = None
 
# The constructed linked list is:
# 1.2.3.4.5
start = push(start, 5)
start = push(start, 4)
start = push(start, 3)
start = push(start, 2)
start = push(start, 1)
start = push(start, 0)
 
print("\n Initial Linked list")
printList(start)
m = 4 # no.of nodes to change
temp = None
moveToFront(start, temp, m)
 
print("\n Final Linked list")
start = first
printList(start)
 
# This code is contributed by Arnab Kundu

C#

// C# Program to move last m elements
// to front in a given linked list
using System;
 
class GFG
{
    // A linked list node
    class Node
    {
        public int data;
        public Node next;
    }
 
    static Node first, last;
 
    static int length = 0;
 
    // Function to print nodes
    // in a given linked list
    static void printList(Node node)
    {
        while (node != null)
        {
            Console.Write("{0} ", node.data);
            node = node.next;
        }
    }
 
    // Pointer head and p are being used here
    // because, the head of the linked list
    // is changed in this function.
    static void moveToFront(Node head,
                            Node p, int m)
    {
        // If the linked list is empty,
        // or it contains only one node,
        // then nothing needs to be done,
        // simply return
        if (head == null)
            return;
 
        p = head;
        head = head.next;
        m++;
 
        // if m value reaches length,
        // the recursion will end
        if (length == m)
        {
 
            // breaking the link
            p.next = null;
 
            // connecting last to first &
            // will make another node as head
            last.next = first;
 
            // Making the first node of
            // last m nodes as root
            first = head;
        }
        else
            moveToFront(head, p, m);
    }
 
    // UTILITY FUNCTIONS
 
    // Function to add a node at
    // the beginning of Linked List
    static Node 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;
 
        // making first & last nodes
        if (length == 0)
            last = head_ref;
        else
            first = head_ref;
 
        // increase the length
        length++;
        return head_ref;
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        Node start = null;
 
        // The constructed linked list is:
        // 1.2.3.4.5
        start = push(start, 5);
        start = push(start, 4);
        start = push(start, 3);
        start = push(start, 2);
        start = push(start, 1);
        start = push(start, 0);
 
        Console.Write("Initial Linked list\n");
        printList(start);
        int m = 4; // no.of nodes to change
        Node temp = new Node();
        moveToFront(start, temp, m);
 
        Console.Write("\nFinal Linked list\n");
        start = first;
        printList(start);
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
      // JavaScript Program to move last m elements
      // to front in a given linked list
      // A linked list node
      class Node {
        constructor() {
          this.data = 0;
          this.next = null;
        }
      }
 
      var first, last;
 
      var length = 0;
 
      // Function to print nodes
      // in a given linked list
      function printList(node) {
        while (node != null) {
          document.write(node.data + " ");
          node = node.next;
        }
      }
 
      // Pointer head and p are being used here
      // because, the head of the linked list
      // is changed in this function.
      function moveToFront(head, p, m) {
        // If the linked list is empty,
        // or it contains only one node,
        // then nothing needs to be done,
        // simply return
        if (head == null) return;
 
        p = head;
        head = head.next;
        m++;
 
        // if m value reaches length,
        // the recursion will end
        if (length == m) {
          // breaking the link
          p.next = null;
 
          // connecting last to first &
          // will make another node as head
          last.next = first;
 
          // Making the first node of
          // last m nodes as root
          first = head;
        } else moveToFront(head, p, m);
      }
 
      // UTILITY FUNCTIONS
 
      // Function to add a node at
      // the beginning of Linked List
      function push(head_ref, 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_ref;
 
        // move the head to point to the new node
        head_ref = new_node;
 
        // making first & last nodes
        if (length == 0) last = head_ref;
        else first = head_ref;
 
        // increase the length
        length++;
        return head_ref;
      }
 
      // Driver code
      var start = null;
 
      // The constructed linked list is:
      // 1.2.3.4.5
      start = push(start, 5);
      start = push(start, 4);
      start = push(start, 3);
      start = push(start, 2);
      start = push(start, 1);
      start = push(start, 0);
 
      document.write("Initial Linked list <br>");
      printList(start);
      var m = 4; // no.of nodes to change
      var temp = new Node();
      moveToFront(start, temp, m);
 
      document.write("<br> Final Linked list <br>");
      start = first;
      printList(start);
       
      // This code is contributed by rdtank.
    </script>
Producción: 

Initial Linked list
0 1 2 3 4 5 
 Final Linked list
2 3 4 5 0 1

 

Complejidad temporal: O(n), donde n representa la longitud de la lista.
Espacio auxiliar: O(1), no se requiere espacio adicional, por lo que es una constante.

Publicación traducida automáticamente

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