Open In App

Python3 Program to Rotate Doubly linked list by N nodes

Last Updated : 05 Sep, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a doubly linked list, rotate the linked list counter-clockwise by N nodes. Here N is a given positive integer and is smaller than the count of nodes in linked list. 
 


N = 2
Rotated List: 
 


Examples: 
 

Input : a  b  c  d  e   N = 2
Output : c d e a b

Input : a b c d e f g h N = 4
Output : e f g h a b c d


Asked in Amazon 
 


To rotate the Doubly linked list, we need to change next of Nth node to NULL, next of last node to previous head node, and prev of head node to last node and finally change head to (N+1)th node and prev of new head node to NULL (Prev of Head node in doubly linked list is NULL) 
So we need to get hold of three nodes: Nth node, (N+1)th node and last node. Traverse the list from beginning and stop at Nth node. Store pointer to Nth node. We can get (N+1)th node using NthNode->next. Keep traversing till end and store pointer to last node also. Finally, change pointers as stated above and at Last Print Rotated List using 
PrintList Function. 
 

Python3
# Node of a doubly linked list 
class Node: 
    def __init__(self, next = None, 
                       prev = None, data = None): 
        self.next = next # reference to next node in DLL 
        self.prev = prev # reference to previous node in DLL 
        self.data = data 

def push(head, new_data): 

    new_node = Node(data = new_data) 

    new_node.next = head 
    new_node.prev = None

    if head is not None: 
        head.prev = new_node 

    head = new_node
    return head

def printList(head):

    node = head

    print("Given linked list")
    while(node is not None): 
        print(node.data, end = " "), 
        last = node 
        node = node.next
    
def rotate(start, N):
    if N == 0 :
        return

    # Let us understand the below code 
    # for example N = 2 and 
    # list = a <-> b <-> c <-> d <-> e. 
    current = start 

    # current will either point to Nth 
    # or None after this loop. Current 
    # will point to node 'b' in the 
    # above example 
    count = 1
    while count < N and current != None :
        current = current.next
        count += 1

    # If current is None, N is greater 
    # than or equal to count of nodes 
    # in linked list. Don't change the 
    # list in this case 
    if current == None :
        return

    # current points to Nth node. Store 
    # it in a variable. NthNode points to 
    # node 'b' in the above example 
    NthNode = current 

    # current will point to last node 
    # after this loop current will point 
    # to node 'e' in the above example 
    while current.next != None :
        current = current.next

    # Change next of last node to previous 
    # head. Next of 'e' is now changed to 
    # node 'a' 
    current.next = start 

    # Change prev of Head node to current 
    # Prev of 'a' is now changed to node 'e' 
    start.prev = current 

    # Change head to (N+1)th node 
    # head is now changed to node 'c' 
    start = NthNode.next

    # Change prev of New Head node to None 
    # Because Prev of Head Node in Doubly 
    # linked list is None 
    start.prev = None

    # change next of Nth node to None 
    # next of 'b' is now None 
    NthNode.next = None

    return start

# Driver Code
if __name__ == "__main__":
    head = None

    head = push(head, 'e')
    head = push(head, 'd')
    head = push(head, 'c')
    head = push(head, 'b')
    head = push(head, 'a')

    printList(head)
    print("
")
    
    N = 2
    head = rotate(head, N)

    printList(head)

# This code is contributed by vinayak sharma

Output
Given linked list 
a  b  c  d  e
Rotated Linked list 
c  d  e  a  b

Time Complexity: O(N) (N is number of linked list’s node)
Auxiliary Space: O(N)

Please refer complete article on Rotate Doubly linked list by N nodes for more details!



Next Article

Similar Reads