Programa Java para rotar la sublista de una lista vinculada desde la posición M a la 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:

Java

// Java implementation of the above approach 
import java.util.*;
  
class Solution
{
  
    
// Definition of node of linkedlist 
static class ListNode { 
    int data; 
     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. 
static 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) { 
            System.out.print( 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) { 
                System.out.print( head.data+" "); 
                head = head.next; 
            } 
            return; 
        } 
        c = c.next; 
    } 
} 
    
// Function for creating and linking new nodes 
static ListNode push( ListNode head, int val) 
{ 
     ListNode new_node = new ListNode(); 
    new_node.data = val; 
    new_node.next = (head); 
    (head) = new_node; 
    return head;
} 
    
// Driver code 
public static void main(String args[])
{ 
     ListNode head = null; 
    head =push(head, 70); 
    head =push(head, 60); 
    head =push(head, 50); 
    head =push(head, 40); 
    head =push(head, 30); 
    head =push(head, 20); 
    head =push(head, 10); 
    ListNode tmp = head; 
    System.out.print("Given List: "); 
    while (tmp != null) { 
        System.out.print( tmp.data + " "); 
        tmp = tmp.next; 
    } 
    System.out.println();
    
    int m = 3, n = 6, k = 2; 
    System.out.print( "After rotation of sublist: "); 
    rotateSubList(head, m, n, k); 
    
} 
}
  
// This code is contributed
// by Arnab Kundu
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 *