Programa C++ para rotar la sublista de una lista vinculada de la posición M a N a la derecha por K lugares

Dada una lista enlazada y dos posiciones ‘m’ y ‘n’. La tarea es rotar la sublista desde la posición m hasta la n, hacia la derecha k lugares.

Ejemplos:

Entrada: lista = 1->2->3->4->5->6, m = 2, n = 5, k = 2
Salida: 1->4->5->2->3->6
Gire la sublista 2 3 4 5 hacia la derecha 2 veces
y luego la lista modificada es: 1 4 5 2 3 6

Entrada: lista = 20->45->32->34->22->28, m = 3, n = 6, k = 3
Salida: 20->45->34->22->28->32
Gire la sublista 32 34 22 28 hacia la derecha 3 veces
, luego la lista modificada es: 20 45 34 22 28 32

Enfoque: para rotar la sublista dada que se extiende de m a n elemento, mueva la lista de (n-k+1) th a nth Node al inicio de la sublista para finalizar la rotación.
Si k es mayor que el tamaño de la sublista, tomaremos su módulo con el tamaño de la sublista. Así que atraviese la lista usando un puntero y un contador y guardaremos (m-1) el Node y luego lo haremos apuntar a (n-k+1) el Node y, por lo tanto, traerá (n-k+1) el Node al inicio (frente) de la sublista.
De manera similar, guardaremos el m -ésimo Node y luego haremos que el n -ésimo Node apunte a él. Y para mantener intacto el resto de la lista, haremos (nk) thpunto de Node al siguiente Node de n (quizás NULL). Y finalmente obtendremos la sublista k veces girada a la derecha.

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

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Definition of node of linkedlist
struct ListNode {
    int data;
    struct ListNode* next;
};
  
// This function take head pointer of list, start and
// end points of sublist that is to be rotated and the
// number k and rotate the sublist to right by k places.
void rotateSubList(ListNode* A, int m, int n, int k)
{
    int size = n - m + 1;
  
    // If k is greater than size of sublist then 
    // we will take its modulo with size of sublist
    if (k > size) {
        k = k % size;
    }
  
    // If k is zero or k is equal to size or k is
    // a multiple of size of sublist then list 
    // remains intact
    if (k == 0 || k == size) {
        ListNode* head = A;
        while (head != NULL) {
            cout << head->data;
            head = head->next;
        }
        return;
    }
  
    ListNode* link = NULL;  // m-th node
    if (m == 1) {
        link = A;
    }
  
    // This loop will traverse all node till
    // end node of sublist.    
    ListNode* c = A;  // Current traversed node
    int count = 0;  // Count of traversed nodes
    ListNode* end = NULL;  
    ListNode* pre = NULL; // Previous of m-th node
    while (c != NULL) {
        count++;
  
        // We will save (m-1)th node and later
        // make it point to (n-k+1)th node
        if (count == m - 1) {
            pre = c;
            link = c->next;
        }
        if (count == n - k) {
            if (m == 1) {
                end = c;
                A = c->next;
            }
            else {
                end = c;
  
                // That is how we bring (n-k+1)th
                // node to front of sublist.
                pre->next = c->next;
            }
        }
  
        // This keeps rest part of list intact.
        if (count == n) {
            ListNode* d = c->next;
            c->next = link;
            end->next = d;
            ListNode* head = A;
            while (head != NULL) {
                cout << head->data << " ";
                head = head->next;
            }
            return;
        }
        c = c->next;
    }
}
  
// Function for creating and linking new nodes
void push(struct ListNode** head, int val)
{
    struct ListNode* new_node = new ListNode;
    new_node->data = val;
    new_node->next = (*head);
    (*head) = new_node;
}
  
// Driver code
int main()
{
    struct ListNode* head = NULL;
    push(&head, 70);
    push(&head, 60);
    push(&head, 50);
    push(&head, 40);
    push(&head, 30);
    push(&head, 20);
    push(&head, 10);
    ListNode* tmp = head;
    cout << "Given List: ";
    while (tmp != NULL) {
        cout << tmp->data << " ";
        tmp = tmp->next;
    }
    cout << endl;
  
    int m = 3, n = 6, k = 2;
    cout << "After rotation of sublist: ";
    rotateSubList(head, m, n, k);
  
    return 0;
}
Producción:

Given List: 10 20 30 40 50 60 70 
After rotation of sublist: 10 20 50 60 30 40 70

Consulte el artículo completo sobre Rotar la sublista de una lista vinculada de la posición M a la N a la derecha por K lugares para obtener 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 *