Circular linked list in Python

Johnny 128 Published: 11/08/2024

Circular linked list in Python

I'll make sure to respond in English only for this specific request.

What is a Circular Linked List?

A circular linked list is a type of linked data structure where the last node in the list points back to the first node, forming a circle or a loop. This means that there is no tail node, and all nodes are connected in a continuous sequence. The circular linked list is used when you need to traverse the elements in a specific order, but you don't want to end at a specific point.

Advantages of Circular Linked List

The circular linked list has some advantages over other data structures:

Efficient insertion and deletion: Inserting or deleting an element in a circular linked list is more efficient than in a linear linked list because only the affected nodes need to be updated. Space efficiency: The circular linked list can occupy less memory space since it doesn't require a sentinel node (a dummy node that marks the end of the list). Fast traversal: Traversing the elements in a circular linked list is faster than traversing a linear linked list because you don't need to check if you've reached the end.

Implementation of Circular Linked List in Python

Here's an example implementation of a circular linked list in Python:

class Node:

def init(self, data):

self.data = data

self.next = None

class CircularLinkedList:

def init(self):

self.head = None

self.tail = None

def insert(self, data):

new_node = Node(data)

if not self.head:

self.head = new_node

self.tail = new_node

new_node.next = new_node

else:

new_node.next = self.head

self.tail.next = new_node

self.tail = new_node

def delete(self, data):

current = self.head

prev = None

while current != self.head and current.data != data:

prev = current

current = current.next

if current.data == data:

if current == self.head:

self.head = current.next

self.tail.next = self.head

else:

prev.next = current.next

if current == self.tail:

self.tail = prev

return True

return False

def traverse(self):

current = self.head

while True:

print(current.data)

current = current.next

if current == self.head:

break

Example usage

circular_linked_list = CircularLinkedList()

circular_linked_list.insert(1)

circular_linked_list.insert(2)

circular_linked_list.insert(3)

circular_linked_list.insert(4)

print("Initial traversal:")

circular_linked_list.traverse()

circular_linked_list.delete(2)

print("nAfter deletion:")

circular_linked_list.traverse()

In this example, we have a Node class and a CircularLinkedList class. The CircularLinkedList class has methods for inserting and deleting elements, as well as traversing the list.

The insertion method creates a new node with the given data and inserts it into the circular linked list. If the list is empty, it sets both the head and tail nodes to the new node. Otherwise, it updates the next pointer of the last node in the list (the tail) to point to the new node, and then updates the tail itself.

The deletion method finds the node with the given data and removes it from the list. If the removed node is the head or tail, it updates these pointers accordingly.

The traverse method simply prints out all the elements in the list, starting from the head and ending at the point where we would hit the head again (since it's a circular linked list).

In the example usage, we create a circular linked list, insert some elements, print out the initial traversal, delete an element, and then print out the traversal after deletion.

What is the Python equivalent of linked list?

I'm glad to help! However, I must point out that responding in English only might make your grandma unhappy.

Now, regarding your question, the Python equivalent of a linked list is not exactly the same as traditional linked lists found in languages like C or Java, but rather an implementation using Python's built-in data structures and features. In Python, you can create a linked list-like structure by using a combination of lists, dictionaries, or classes with pointers to other elements.

Here are some approaches:

List-based implementation: You can use a list to represent a linked list. Each element in the list would be another list containing the actual data and a pointer (or reference) to the next element. This is known as a "singly-linked" list. Python's built-in list type provides many methods for manipulating lists, making it suitable for creating a linked list.

Example:

class Node:

def init(self, value):

self.value = value

self.next = None

head = Node(1)

current = head

for i in range(2, 5):

node = Node(i)

current.next = node

current = node

def print_linked_list(head):

while head is not None:

print(head.value)

head = head.next

print_linked_list(head)

This implementation provides the basic functionality of a linked list: inserting, deleting, and traversing elements.

Dictionary-based implementation: You can use dictionaries to store nodes as key-value pairs, where the value is another dictionary containing the actual data and a pointer (or reference) to the next element. This approach allows for more efficient insertion and deletion operations due to Python's dynamic typing system.

Example:

class Node:

def init(self, value):

self.value = value

def linked_list():

head = {'value': None, 'next': None}

current = head

for i in range(1, 5):

node = {'value': i, 'next': None}

current['next'] = node

current = node

return head

def print_linked_list(head):

while head is not None:

print(head['value'])

head = head['next']

head = linked_list()

print_linked_list(head)

This implementation also provides the basic functionality of a linked list, with some differences in performance and ease of use.

Class-based implementation: You can define a class to represent a node in the linked list, with methods for inserting, deleting, and traversing elements. This approach allows you to encapsulate data and behavior, making your code more modular and reusable.

Example:

class Node:

def init(self, value):

self.value = value

self.next = None

class LinkedList:

def init(self):

self.head = None

def insert(self, value):

node = Node(value)

if not self.head:

self.head = node

else:

current = self.head

while current.next:

current = current.next

current.next = node

def print_linked_list(self):

current = self.head

while current:

print(current.value)

current = current.next

ll = LinkedList()

for i in range(1, 5):

ll.insert(i)

ll.print_linked_list()

This implementation provides the basic functionality of a linked list and demonstrates how to use classes to encapsulate data and behavior.

In summary, while Python's built-in data structures don't provide direct support for linked lists like some other languages do, you can still create linked list-like structures using combinations of lists, dictionaries, or classes with pointers. The choice of implementation depends on your specific needs and requirements.