A circular linked list is a list in which there is no None link. and the link of the last node refers to the first node. each node has a successor and all the nodes form a circle. to perform the operations on a circular linked list we generally and will need to store the reference of the last node of the list. because if we store the reference of the first node then we don't perform operations such as insertion, deletion, etc in constant time. and we need to traverse the whole linked list.

so to perform all the operations in constant time we always store the reference of the last node. we also use the circular linked list to implement the other data structures like the implementation of a queue. because the insertions and deletion in the queue take constant time using a circular linked list.

### Python program to implement Circular linked list

```class Node(object):

def __init__(self, value):
self.info = value

def __init__(self):
self.last = None
def display_list(self):

if self.last == None:
print("List is empty\n")

while True:
print(p.info, " ", end='')
break        print()

def insert_in_beginning(self, data):
temp = Node(data)

def insert_in_empty_list(self, data):
temp = Node(data)
self.last = temp

def insert_at_end(self,data):
temp = Node(data)
self.last = temp

def create_list(self):
n = int(input("Enter the number of nodes : "))
if n == 0:
return        data = int(input("Enter the element to be inserted : "))
self.insert_in_empty_list(data)

for i in range(n-1):
data = int(input("Enter the element to be inserted : "))
self.insert_at_end(data)

def insert_after(self, data, x):

while True:
if p.info == x:
break
if p == self.last.link and p.info != x:
print(x, " not present in the list")
else:
temp = Node(data)
if p == self.last:
self.last = temp

def delete_first_node(self):
if self.last is None:

def delete_last_node(self):
if self.last is None:
self.last = None            return
self.last = p

def delete_node(self,x):

if self.last is None:
return        if self.last.link == self.last and self.last.info == x:
self.last = None            return        if self.last.link.info == x:
return

else:
if self.last.info == x:
self.last = p

#################################################

list.create_list()

while True:
print("1. Display list")
print("2. Insert in empty list")
print("3. Insert a node in the beginning of the list")
print("4. Insert a node at the end of the list")
print("5. Insert a node after a specified node")
print("6. Delete first node")
print("7. Delete last node")
print("8. Delete any node")
print("9. Quite")

option = int(input("Enter your choice : "))

if option == 1:
list.display_list()
elif option == 2:
data = int(input("Enter the element to be inserted : "))
list.insert_in_empty_list(data)
elif option == 3:
data = int(input("Enter the element to be inserted : "))
list.insert_in_beginning(data)
elif option == 4:
data = int(input("Enter the element to be inserted : "))
list.insert_at_end(data)
elif option == 5:
data = int(input("Enter the element to be inserted : "))
x = int(input("Enter the element after which to insert : "))
list.insert_after(data,x)
elif option == 6:
list.delete_first_node()
elif option == 7:
list.delete_last_node()
elif option == 8:
data = int(input("Enter the element to be deleted : "))
list.delete_node(data)
elif option == 9:
break    else:
print("Wrong option")
print()```