99 Delete operation is more efficient
1010"""
1111
12+ from dataclasses import dataclass
13+ from typing import Self
1214
15+
16+ @dataclass
1317class 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
3226class 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
4843class 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