11# Implementation of Circular Queue using linked lists
22# https://en.wikipedia.org/wiki/Circular_buffer
33
4+ from __future__ import annotations
5+
46from typing import Any
57
68
@@ -18,16 +20,16 @@ class CircularQueueLinkedList:
1820 """
1921
2022 def __init__ (self , initial_capacity : int = 6 ) -> None :
21- self .front = None
22- self .rear = None
23+ self .front : Node | None = None
24+ self .rear : Node | None = None
2325 self .create_linked_list (initial_capacity )
2426
2527 def create_linked_list (self , initial_capacity : int ) -> None :
2628 current_node = Node ()
2729 self .front = current_node
2830 self .rear = current_node
2931 previous_node = current_node
30- for i in range (1 , initial_capacity ):
32+ for _ in range (1 , initial_capacity ):
3133 current_node = Node ()
3234 previous_node .next = current_node
3335 current_node .prev = previous_node
@@ -49,9 +51,14 @@ def is_empty(self) -> bool:
4951 >>> cq.is_empty()
5052 True
5153 """
52- return self .front == self .rear and self .front .data is None
5354
54- def first (self ) -> Any :
55+ return (
56+ self .front == self .rear
57+ and self .front is not None
58+ and self .front .data is None
59+ )
60+
61+ def first (self ) -> Any | None :
5562 """
5663 Returns the first element of the queue
5764 >>> cq = CircularQueueLinkedList()
@@ -74,7 +81,7 @@ def first(self) -> Any:
7481 'b'
7582 """
7683 self .check_can_perform_operation ()
77- return self .front .data
84+ return self .front .data if self . front else None
7885
7986 def enqueue (self , data : Any ) -> None :
8087 """
@@ -92,11 +99,13 @@ def enqueue(self, data: Any) -> None:
9299 ...
93100 Exception: Empty Queue
94101 """
102+ if self .rear is None :
103+ return
104+
95105 self .check_is_full ()
96- if self .is_empty ():
97- self .rear .data = data
98- else :
106+ if not self .is_empty ():
99107 self .rear = self .rear .next
108+ if self .rear :
100109 self .rear .data = data
101110
102111 def dequeue (self ) -> Any :
@@ -117,6 +126,8 @@ def dequeue(self) -> Any:
117126 Exception: Empty Queue
118127 """
119128 self .check_can_perform_operation ()
129+ if self .rear is None or self .front is None :
130+ return
120131 if self .front == self .rear :
121132 data = self .front .data
122133 self .front .data = None
@@ -133,15 +144,15 @@ def check_can_perform_operation(self) -> None:
133144 raise Exception ("Empty Queue" )
134145
135146 def check_is_full (self ) -> None :
136- if self .rear .next == self .front :
147+ if self .rear and self . rear .next == self .front :
137148 raise Exception ("Full Queue" )
138149
139150
140151class Node :
141152 def __init__ (self ) -> None :
142- self .data = None
143- self .next = None
144- self .prev = None
153+ self .data : Any | None = None
154+ self .next : Node | None = None
155+ self .prev : Node | None = None
145156
146157
147158if __name__ == "__main__" :
0 commit comments