Skip to content

Commit baab802

Browse files
doubly linked list: add dataclass and typing (#12647)
* Node is a dataclass * fix mypy errors * LinkedList is a dataclass * fix mypy errors * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py * Update doubly_linked_list_two.py --------- Co-authored-by: Maxim Smolskiy <[email protected]>
1 parent f10a5cb commit baab802

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

data_structures/linked_list/doubly_linked_list_two.py

+29-33
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,19 @@
99
Delete operation is more efficient
1010
"""
1111

12+
from dataclasses import dataclass
13+
from typing import Self
1214

15+
16+
@dataclass
1317
class Node:
14-
def __init__(self, data: int, previous=None, next_node=None):
15-
self.data = data
16-
self.previous = previous
17-
self.next = next_node
18+
data: int
19+
previous: Self | None = None
20+
next: Self | None = None
1821

1922
def __str__(self) -> str:
2023
return f"{self.data}"
2124

22-
def get_data(self) -> int:
23-
return self.data
24-
25-
def get_next(self):
26-
return self.next
27-
28-
def get_previous(self):
29-
return self.previous
30-
3125

3226
class LinkedListIterator:
3327
def __init__(self, head):
@@ -40,43 +34,43 @@ def __next__(self):
4034
if not self.current:
4135
raise StopIteration
4236
else:
43-
value = self.current.get_data()
44-
self.current = self.current.get_next()
37+
value = self.current.data
38+
self.current = self.current.next
4539
return value
4640

4741

42+
@dataclass
4843
class LinkedList:
49-
def __init__(self):
50-
self.head = None # First node in list
51-
self.tail = None # Last node in list
44+
head: Node | None = None # First node in list
45+
tail: Node | None = None # Last node in list
5246

5347
def __str__(self):
5448
current = self.head
5549
nodes = []
5650
while current is not None:
57-
nodes.append(current.get_data())
58-
current = current.get_next()
51+
nodes.append(current.data)
52+
current = current.next
5953
return " ".join(str(node) for node in nodes)
6054

6155
def __contains__(self, value: int):
6256
current = self.head
6357
while current:
64-
if current.get_data() == value:
58+
if current.data == value:
6559
return True
66-
current = current.get_next()
60+
current = current.next
6761
return False
6862

6963
def __iter__(self):
7064
return LinkedListIterator(self.head)
7165

7266
def get_head_data(self):
7367
if self.head:
74-
return self.head.get_data()
68+
return self.head.data
7569
return None
7670

7771
def get_tail_data(self):
7872
if self.tail:
79-
return self.tail.get_data()
73+
return self.tail.data
8074
return None
8175

8276
def set_head(self, node: Node) -> None:
@@ -103,18 +97,20 @@ def insert_before_node(self, node: Node, node_to_insert: Node) -> None:
10397
node_to_insert.next = node
10498
node_to_insert.previous = node.previous
10599

106-
if node.get_previous() is None:
100+
if node.previous is None:
107101
self.head = node_to_insert
108102
else:
109103
node.previous.next = node_to_insert
110104

111105
node.previous = node_to_insert
112106

113-
def insert_after_node(self, node: Node, node_to_insert: Node) -> None:
107+
def insert_after_node(self, node: Node | None, node_to_insert: Node) -> None:
108+
assert node is not None
109+
114110
node_to_insert.previous = node
115111
node_to_insert.next = node.next
116112

117-
if node.get_next() is None:
113+
if node.next is None:
118114
self.tail = node_to_insert
119115
else:
120116
node.next.previous = node_to_insert
@@ -136,27 +132,27 @@ def insert_at_position(self, position: int, value: int) -> None:
136132
def get_node(self, item: int) -> Node:
137133
node = self.head
138134
while node:
139-
if node.get_data() == item:
135+
if node.data == item:
140136
return node
141-
node = node.get_next()
137+
node = node.next
142138
raise Exception("Node not found")
143139

144140
def delete_value(self, value):
145141
if (node := self.get_node(value)) is not None:
146142
if node == self.head:
147-
self.head = self.head.get_next()
143+
self.head = self.head.next
148144

149145
if node == self.tail:
150-
self.tail = self.tail.get_previous()
146+
self.tail = self.tail.previous
151147

152148
self.remove_node_pointers(node)
153149

154150
@staticmethod
155151
def remove_node_pointers(node: Node) -> None:
156-
if node.get_next():
152+
if node.next:
157153
node.next.previous = node.previous
158154

159-
if node.get_previous():
155+
if node.previous:
160156
node.previous.next = node.next
161157

162158
node.next = None

0 commit comments

Comments
 (0)