Rotate a Linked List | A Helpful Line-by-Line Code Tutorial

'''
Rotating the Linked List
1. Convert the Linked List into a Circular Linked List
    by joining the last node with the root.
2. Move the root the amount of positions needed to be
    changed
3. Disconnect the last element counting the length from
    the new root.
'''


# The Node
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        print("New Node : {}".format(data))

# Function to rotate the Linked List
def rotateList(root, skip):

    print("Rotate by {}".format(skip))

    length = 0

    # Use a decoy
    node = root

    # Connecting the ends
    while node.next is not None:
        length += 1
        node = node.next
    node.next = root

    # Move the root
    for x in range(0, skip):
        root = root.next

    # Use a decoy
    node = root

    # Break the end Connection
    for x in range(0, length):
        node = node.next
    node.next = None

    return root

# The Main Function
def main():

    print("Rotate a Linked List")

    root = Node(1)

    add(root, Node(2))
    add(root, Node(3))
    add(root, Node(4))
    add(root, Node(5))
    add(root, Node(6))

    print("Before Rotation")

    printList(root)

    root = rotateList(root, 2)

    print("After Rotation")

    printList(root)

# Function to add nodes to the Linked List
def add(root, node):
    while root.next is not None:
        root = root.next
    root.next = node

# Function to print the Linked List
def printList(root):
    print("The List is ", end="")
    while root is not None:
        print("{}".format(root.data), end="")
        if root.next is not None:
            root = root.next
            print(" -> ", end="")
        else:
            break
    print()

if __name__ == "__main__":
    main()