Add circular linked list
parent
e60d299077
commit
4a8fc27494
|
@ -0,0 +1,130 @@
|
|||
"""
|
||||
Data Structure : Circular Linked List.
|
||||
Time Complexity : O(1) for all operations.
|
||||
Space Complexity : O(n) Where, 'n' is the number of nodes in the linked list.
|
||||
"""
|
||||
|
||||
|
||||
class Node:
|
||||
"""
|
||||
Class to represent a Node.
|
||||
Attributes:
|
||||
- value (int) : The value of the node.
|
||||
- next (Node) : The reference of the next node.
|
||||
"""
|
||||
|
||||
def __init__(self, value: int):
|
||||
self.value = value
|
||||
self.next = None
|
||||
|
||||
|
||||
class CircularLinkedList:
|
||||
"""
|
||||
CLass to represent circular linked list and perform its operations.
|
||||
Attributes:
|
||||
- head (Node) : The first node in the linked list.
|
||||
- tail (Node) : The last node in the linked list.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.head = None
|
||||
self.tail = None
|
||||
|
||||
def __iter__(self):
|
||||
trackNode = self.head
|
||||
while trackNode.next != self.head:
|
||||
yield trackNode.value
|
||||
trackNode = trackNode.next
|
||||
yield trackNode.value
|
||||
|
||||
def __str__(self):
|
||||
result = ""
|
||||
for value in self:
|
||||
result += f'{value} -> '
|
||||
|
||||
return result
|
||||
|
||||
def isEmpty(self) -> bool:
|
||||
"""Return 'True' if the circular linked list is Empty. Otherwise, return 'False'."""
|
||||
if self.head is None:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def insertNode(self, value: int, location: int = -1) -> None:
|
||||
"""
|
||||
Insert the node at the given location. Default in the end.
|
||||
Args:
|
||||
- value (int): The value of the node.
|
||||
- location (int): The position of the node to insert into the linked list.
|
||||
- 0 : At the beginning.
|
||||
- -1 : At the end.
|
||||
- Any `int` : At the specified location.
|
||||
"""
|
||||
|
||||
newNode = Node(value)
|
||||
|
||||
# Insertion at the beginning of the circular linked list.
|
||||
if location == 0:
|
||||
if not self.isEmpty():
|
||||
self.head = newNode
|
||||
newNode.next = self.tail.next
|
||||
self.tail.next = self.head
|
||||
else:
|
||||
self.head = self.tail = newNode
|
||||
newNode.next = newNode
|
||||
|
||||
# Insertion at the end of the circular linked list.
|
||||
elif location == -1:
|
||||
if not self.isEmpty():
|
||||
newNode.next = self.tail.next
|
||||
self.tail.next = newNode
|
||||
self.tail = newNode
|
||||
else:
|
||||
self.head = self.tail = newNode
|
||||
newNode.next = newNode
|
||||
else:
|
||||
trackLocation = 0
|
||||
trackNode = self.head
|
||||
|
||||
while trackLocation < trackLocation - 1:
|
||||
trackNode = trackNode.next
|
||||
trackLocation += 1
|
||||
|
||||
nextNode = trackNode.next
|
||||
trackNode.next = newNode
|
||||
newNode.next = nextNode
|
||||
|
||||
def deleteNode(self, value: int) -> None:
|
||||
"""
|
||||
Delete the node if the value exist in the linked list.
|
||||
Args:
|
||||
- value (int) : The value of the node.
|
||||
"""
|
||||
if not self.isEmpty():
|
||||
trackNode = self.head
|
||||
previousNode = None
|
||||
while trackNode.value != value:
|
||||
previousNode = trackNode
|
||||
trackNode = trackNode.next
|
||||
|
||||
if trackNode == self.head:
|
||||
self.head = self.head.next
|
||||
self.tail.next = self.head
|
||||
elif trackNode == self.tail:
|
||||
previousNode.next = self.head
|
||||
else:
|
||||
previousNode.next = trackNode.next
|
||||
else:
|
||||
print("The linked list is Empty.")
|
||||
|
||||
|
||||
# TESTING THE CIRCULAR LINKED LIST
|
||||
cll = CircularLinkedList()
|
||||
cll.insertNode(10)
|
||||
cll.insertNode(20)
|
||||
cll.insertNode(1000, 1)
|
||||
cll.insertNode(20)
|
||||
|
||||
cll.deleteNode(1000)
|
||||
print(cll)
|
Loading…
Reference in New Issue