'''
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()