Open In App

Python3 Program To Rotate Linked List Block Wise

Last Updated : 31 Aug, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given a Linked List of length n and block length k rotate in a circular manner towards right/left each block by a number d. If d is positive rotate towards right else rotate towards left.

Examples: 

Input: 1->2->3->4->5->6->7->8->9->NULL, 
        k = 3 
        d = 1
Output: 3->1->2->6->4->5->9->7->8->NULL
Explanation: Here blocks of size 3 are
rotated towards right(as d is positive) 
by 1.
 
Input: 1->2->3->4->5->6->7->8->9->10->
               11->12->13->14->15->NULL, 
        k = 4 
        d = -1
Output: 2->3->4->1->6->7->8->5->10->11
             ->12->9->14->15->13->NULL
Explanation: Here, at the end of linked 
list, remaining nodes are less than k, i.e.
only three nodes are left while k is 4. 
Rotate those 3 nodes also by d.

Prerequisite: Rotate a linked list
The idea is if the absolute value of d is greater than the value of k, then rotate the link list by d % k times. If d is 0, no need to rotate the linked list at all. 

Python3




# Python3 program to rotate a linked
# list block wise
 
# Link list node
class Node:   
    def __init__(self, data):     
        self.data = data
        self.next = None
 
# Recursive function to rotate one block
def rotateHelper(blockHead, blockTail,
                 d, tail, k):   
    if (d == 0):
        return blockHead, tail
  
    # Rotate Clockwise
    if (d > 0):
        temp = blockHead
        i = 1       
        while (temp.next.next != None and
               i < k - 1):
            temp = temp.next
            i += 1           
        blockTail.next = blockHead
        tail = temp
        return rotateHelper(blockTail, temp,
                            d - 1, tail, k)
 
    # Rotate anti-Clockwise
    if (d < 0):
        blockTail.next = blockHead
        tail = blockHead
        return rotateHelper(blockHead.next,
                            blockHead, d + 1,
                            tail, k)
     
# Function to rotate the linked list
# block-wise
def rotateByBlocks(head, k, d):
 
    # If length is 0 or 1 return head
    if (head == None or head.next == None):
        return head
  
    # If degree of rotation is 0, return head
    if (d == 0):
        return head
    temp = head
    tail = None
  
    # Traverse upto last element of this block
    i = 1   
    while temp.next != None and i < k:
        temp = temp.next
        i += 1
  
    # Storing the first node of next block
    nextBlock = temp.next
  
    # If nodes of this block are less than k.
    # Rotate this block also
    if (i < k):
        head, tail = rotateHelper(head, temp,
                                  d % k, tail, i)
    else:
        head, tail = rotateHelper(head, temp,
                                  d % k, tail, k)
  
    # Append the new head of next block to
    # the tail of this block
    tail.next = rotateByBlocks(nextBlock,
                               k, d % k);
  
    # Return head of updated Linked List
    return head;
 
# UTILITY FUNCTIONS
# Function to push a node
def push(head_ref, new_data):
 
    new_node = Node(new_data)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
 
# Function to print linked list
def printList(node):
    while (node != None):
        print(node.data, end = ' ')
        node = node.next
     
# Driver code
if __name__=='__main__':
     
    # Start with the empty list
    head = None
  
    # Create a list 1.2.3.4.5.
    # 6.7.8.9.None
    for  i in range(9, 0, -1):
        head = push(head, i)
    print("Given linked list ")
    printList(head)
  
    # k is block size and d is number
    # of rotations in every block.
    k = 3
    d = 2
    head = rotateByBlocks(head, k, d)
  
    print(
    "Rotated by blocks Linked list ")
    printList(head)
 # This code is contributed by rutvik_56


Output:

Given linked list 
1 2 3 4 5 6 7 8 9 
Rotated by blocks Linked list 
2 3 1 5 6 4 8 9 7

Time Complexity: O(n) where n is no of node in given linked list

Please refer complete article on Rotate Linked List block wise for more details!



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads