File tree Expand file tree Collapse file tree
Sprint-2/implement_linked_list Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ from dataclasses import dataclass
2+ from typing import Any , Optional
3+ # to reduce memory usage we use slots true to tells Python not to create a dynamic __dict__ for every node,
4+ @dataclass (slots = True )
5+ class Node :
6+ value : Any
7+ next : Optional ['Node' ] = None
8+ previous : Optional ['Node' ] = None
9+
10+
11+ class LinkedList :
12+ def __init__ (self ) -> None :
13+ self .head : Optional [Node ] = None
14+ self .tail : Optional [Node ] = None
15+
16+ def push_head (self , value : Any ) -> Node :
17+ new_node = Node (value )
18+
19+ if not self .head :
20+ self .head = new_node
21+ self .tail = new_node
22+ else :
23+ new_node .next = self .head
24+ self .head .previous = new_node
25+ self .head = new_node
26+
27+ return new_node
28+
29+ def pop_tail (self ) -> Optional [Any ]:
30+ if not self .tail :
31+ return None
32+
33+ value_to_return = self .tail .value
34+ self .remove (self .tail )
35+ return value_to_return
36+
37+ def remove (self , node_handle : Optional [Node ]) -> None :
38+ if not node_handle :
39+ return
40+
41+ if node_handle == self .head :
42+ self .head = node_handle .next
43+ if self .head :
44+ self .head .previous = None
45+ else :
46+ self .tail = None
47+
48+ elif node_handle == self .tail :
49+ self .tail = node_handle .previous
50+ if self .tail :
51+ self .tail .next = None
52+ else :
53+ self .head = None
54+
55+ else :
56+ if node_handle .previous and node_handle .next :
57+ node_handle .previous .next = node_handle .next
58+ node_handle .next .previous = node_handle .previous
59+
60+ node_handle .next = None
61+ node_handle .previous = None
You can’t perform that action at this time.
0 commit comments