9
9
Delete operation is more efficient
10
10
"""
11
11
12
+ from dataclasses import dataclass
13
+ from typing import Self
12
14
15
+
16
+ @dataclass
13
17
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
18
21
19
22
def __str__ (self ) -> str :
20
23
return f"{ self .data } "
21
24
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
-
31
25
32
26
class LinkedListIterator :
33
27
def __init__ (self , head ):
@@ -40,43 +34,43 @@ def __next__(self):
40
34
if not self .current :
41
35
raise StopIteration
42
36
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
45
39
return value
46
40
47
41
42
+ @dataclass
48
43
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
52
46
53
47
def __str__ (self ):
54
48
current = self .head
55
49
nodes = []
56
50
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
59
53
return " " .join (str (node ) for node in nodes )
60
54
61
55
def __contains__ (self , value : int ):
62
56
current = self .head
63
57
while current :
64
- if current .get_data () == value :
58
+ if current .data == value :
65
59
return True
66
- current = current .get_next ()
60
+ current = current .next
67
61
return False
68
62
69
63
def __iter__ (self ):
70
64
return LinkedListIterator (self .head )
71
65
72
66
def get_head_data (self ):
73
67
if self .head :
74
- return self .head .get_data ()
68
+ return self .head .data
75
69
return None
76
70
77
71
def get_tail_data (self ):
78
72
if self .tail :
79
- return self .tail .get_data ()
73
+ return self .tail .data
80
74
return None
81
75
82
76
def set_head (self , node : Node ) -> None :
@@ -103,18 +97,20 @@ def insert_before_node(self, node: Node, node_to_insert: Node) -> None:
103
97
node_to_insert .next = node
104
98
node_to_insert .previous = node .previous
105
99
106
- if node .get_previous () is None :
100
+ if node .previous is None :
107
101
self .head = node_to_insert
108
102
else :
109
103
node .previous .next = node_to_insert
110
104
111
105
node .previous = node_to_insert
112
106
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
+
114
110
node_to_insert .previous = node
115
111
node_to_insert .next = node .next
116
112
117
- if node .get_next () is None :
113
+ if node .next is None :
118
114
self .tail = node_to_insert
119
115
else :
120
116
node .next .previous = node_to_insert
@@ -136,27 +132,27 @@ def insert_at_position(self, position: int, value: int) -> None:
136
132
def get_node (self , item : int ) -> Node :
137
133
node = self .head
138
134
while node :
139
- if node .get_data () == item :
135
+ if node .data == item :
140
136
return node
141
- node = node .get_next ()
137
+ node = node .next
142
138
raise Exception ("Node not found" )
143
139
144
140
def delete_value (self , value ):
145
141
if (node := self .get_node (value )) is not None :
146
142
if node == self .head :
147
- self .head = self .head .get_next ()
143
+ self .head = self .head .next
148
144
149
145
if node == self .tail :
150
- self .tail = self .tail .get_previous ()
146
+ self .tail = self .tail .previous
151
147
152
148
self .remove_node_pointers (node )
153
149
154
150
@staticmethod
155
151
def remove_node_pointers (node : Node ) -> None :
156
- if node .get_next () :
152
+ if node .next :
157
153
node .next .previous = node .previous
158
154
159
- if node .get_previous () :
155
+ if node .previous :
160
156
node .previous .next = node .next
161
157
162
158
node .next = None
0 commit comments