Table of Contents
In this article, we will implement a circular singly linked list. A singly linked list is similar to the singly linked list, except the next pointer of the last node points to the first node and is not NULL
.
Implementation of a Circular Singly Linked List
Let’s go ahead and see how to implement the basic functionalities of a circular linked list.
Insert
It takes a value and adds it at the end of the list. Initially, when the list is empty, i.e., head=NULL
, we create a node with the given value and assign it to the head. Moreover, we set the next pointer of the head to itself as this is the only node.
When the list contains other items, then we need to find the last node. For that, we create a temp variable that starts from the head and continues moving forward till its next is equal to the head. We make a new node with the given value and the next pointer pointing to the head. We assign this node to the next temp (the last node).
Delete
It takes a value and removes it from the list. If not found, it throws an error.
Below are the steps needed to perform a delete operation on a Circular singly linked list:
- We check if the node to be deleted is the first node. If it is, then if the list contains only a single item, we set the head to
NULL
. Otherwise, we find the last node. - We update the head to refer to its next node and set the last node next to the new head.
- We delete the previous head and return from the method.
If the node to be deleted is not the first one, we find the node (prev) before the node to be deleted (temp). Once found, we change prev.next
to point to the next of temp. Finally, delete temp to free the memory.
Search
This method takes a value and finds the position of its node. If not found, it raises an error.
To search a circular linked list, first, we check if the head’s value is equal to the given one. If it is, we return 0. Otherwise, we create a temp variable that initially refers to the head’s next. We run a while loop that runs till temp is equal to the head, i.e., the list is traversed completely. At each iteration, we compare the current node’s value with the given one. If they are equal, we return the index of that node. Otherwise, we advance temp to point to its next node and increment i.
Traverse
It iterates over the list and prints each node’s value. It works similar to the search method, except it displays each node’s value and does not perform any comparison.
Code to Implement a Circular Singly Linked List
The code is given below.
#node for the linked list class Node: def __init__(self, value=None, next=None): self.value = value self.next = next #reference to the next node #implementation of linked list class CircularLinkedList: def __init__(self): self.head = None #adds a node at the end of the linked list def insert(self, value): node = Node(value, self.head) #create a node if self.head == None: #if list is empty insert a node at the start self.head = node self.head.next = node else: temp = self.head #iterate through the list till last node is found, i.e., last node next pointer refers to the first node. while temp.next != self.head: temp = temp.next temp.next = node #adding a new node #find the position of the given value in the list def search(self, value): if self.head: #list is not empty if self.head.value == value: #if the given value is equal to the head's value return 0 temp = self.head.next i = 1 #iterate through the list while temp != self.head: if temp.value == value: return i temp = temp.next i += 1 raise KeyError(f'Item with the value {value} does not exist') def deleteHead(self): deleted_node = self.head if self.head.next == self.head: #list contains a single node only self.head = None else: #get the last node temp = self.head while temp.next != self.head: temp = temp.next self.head = self.head.next #update the head temp.next = self.head #make the last next refer to the new head del deleted_node #remove the node with the given value from the list or throw an error def delete(self, value): if self.head: #if the list is not empty if self.head.value == value: #if the node to be deleted is the first node self.deleteHead() return else: temp = self.head.next #node after the head node prev=self.head #iterate through the list while temp != self.head: if temp.value == value: prev.next = temp.next del temp return else: prev = temp temp = temp.next raise KeyError(f'Item with the value {value} does not exist') #traverse the complete list and print the node value def traverse(self): if self.head: #list is not empty print(self.head.value, end="\t") #display value of head node temp = self.head.next #iterate through the list while temp != self.head: print(temp.value, end="\t") temp = temp.next print("") ll = CircularLinkedList() #create list #insert values ll.insert(1) ll.insert(8) ll.insert(6) ll.insert(2) print("Linked list:") ll.traverse() #search operation print("The value 2 is found at position", ll.search(2)) print("The value 1 is found at position", ll.search(1)) #delete operation ll.delete(1) ll.delete(6) print("Linked list:") ll.traverse()
Output
Linked list: 1 8 6 2 The value 2 is found at position 3 The value 1 is found at position 0 Linked list: 8 2
ll = CircularLinkedList() #create list #insert values ll.insert(1) ll.insert(8) ll.insert(6) print("Linked list:") ll.traverse() #search operation print("The value 2 is found at position", ll.search(2))
Output