Programa Python3 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:

Python3

# Python3 implementation of the above approach
import math
  
# Definition of node of linkedlist
class Node: 
    def __init__(self, data): 
        self.data = data 
        self.next = None
  
# 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.
def rotateSubList(A, m, n, k):
    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 or k == size):
        head = A
        while (head != None):
            print(head.data)
            head = head.next
          
        return
      
    link = None # m-th node
    if (m == 1) :
        link = A
      
    # This loop will traverse all node till
    # end node of sublist. 
    c = A # Current traversed node
    count = 0 # Count of traversed nodes
    end = None
    pre = None # Previous of m-th node
    while (c != None) :
        count = count + 1
  
        # 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) :
            d = c.next
            c.next = link
            end.next = d
            head = A
            while (head != None) :
                print(head.data, end = " ")
                head = head.next
              
            return
          
        c = c.next
      
# Function for creating and linking new nodes
def push(head, val):
    new_node = Node(val)
    new_node.data = val
    new_node.next = head
    head = new_node
    return head
  
# Driver code
if __name__=='__main__': 
    head = None
    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)
    tmp = head
    print("Given List: ", end = "")
    while (tmp != None) :
        print(tmp.data, end = " ")
        tmp = tmp.next
      
    print()
  
    m = 3
    n = 6
    k = 2 
    print("After rotation of sublist: ", end = "")
    rotateSubList(head, m, n, k)
  
# This code is contributed by Srathore
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 *