@@ -10,6 +10,7 @@ class Node:
10
10
"""
11
11
A node in a circular doubly linked list.
12
12
"""
13
+
13
14
data : Any
14
15
next_node : Node | None = None
15
16
prev_node : Node | None = None
@@ -24,6 +25,7 @@ class CircularDoublyLinkedList:
24
25
- The last node's next points to the first node
25
26
- The first node's previous points to the last node
26
27
"""
28
+
27
29
head : Node | None = None # Reference to the head (first node)
28
30
tail : Node | None = None # Reference to the tail (last node)
29
31
@@ -35,7 +37,7 @@ def __iter__(self) -> Iterator[Any]:
35
37
"""
36
38
if self .head is None :
37
39
return
38
-
40
+
39
41
node = self .head
40
42
while True :
41
43
yield node .data
@@ -81,9 +83,9 @@ def insert_nth(self, index: int, data: Any) -> None:
81
83
"""
82
84
if index < 0 or index > len (self ):
83
85
raise IndexError ("list index out of range." )
84
-
86
+
85
87
new_node : Node = Node (data )
86
-
88
+
87
89
if self .head is None :
88
90
# First node - points to itself in both directions
89
91
new_node .next_node = new_node
@@ -111,12 +113,12 @@ def insert_nth(self, index: int, data: Any) -> None:
111
113
for _ in range (index ):
112
114
assert temp is not None
113
115
temp = temp .next_node
114
-
116
+
115
117
assert temp is not None
116
118
# Insert before temp
117
119
prev_node = temp .prev_node
118
120
assert prev_node is not None
119
-
121
+
120
122
new_node .next_node = temp
121
123
new_node .prev_node = prev_node
122
124
temp .prev_node = new_node
@@ -155,7 +157,7 @@ def delete_nth(self, index: int = 0) -> Any:
155
157
156
158
assert self .head is not None
157
159
assert self .tail is not None
158
-
160
+
159
161
if self .head == self .tail :
160
162
# Only one node
161
163
delete_node = self .head
@@ -173,20 +175,20 @@ def delete_nth(self, index: int = 0) -> Any:
173
175
for _ in range (index ):
174
176
assert delete_node is not None
175
177
delete_node = delete_node .next_node
176
-
178
+
177
179
assert delete_node is not None
178
180
prev_node = delete_node .prev_node
179
181
next_node = delete_node .next_node
180
-
182
+
181
183
assert prev_node is not None
182
184
assert next_node is not None
183
-
185
+
184
186
prev_node .next_node = next_node
185
187
next_node .prev_node = prev_node
186
-
188
+
187
189
if delete_node == self .tail :
188
190
self .tail = prev_node
189
-
191
+
190
192
return delete_node .data
191
193
192
194
def is_empty (self ) -> bool :
@@ -213,7 +215,7 @@ def traverse_backward(self) -> list[Any]:
213
215
"""
214
216
if self .tail is None :
215
217
return []
216
-
218
+
217
219
result = []
218
220
node = self .tail
219
221
while True :
@@ -292,8 +294,14 @@ def test_circular_doubly_linked_list() -> None:
292
294
293
295
# Test circular property
294
296
if circular_doubly_linked_list .head and circular_doubly_linked_list .tail :
295
- assert circular_doubly_linked_list .head .prev_node == circular_doubly_linked_list .tail
296
- assert circular_doubly_linked_list .tail .next_node == circular_doubly_linked_list .head
297
+ assert (
298
+ circular_doubly_linked_list .head .prev_node
299
+ == circular_doubly_linked_list .tail
300
+ )
301
+ assert (
302
+ circular_doubly_linked_list .tail .next_node
303
+ == circular_doubly_linked_list .head
304
+ )
297
305
298
306
299
307
if __name__ == "__main__" :
0 commit comments