Skip to content

Commit 8bdd2a2

Browse files
committed
Create LInkdList optimizing performance
1 parent e718fb4 commit 8bdd2a2

1 file changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

0 commit comments

Comments
 (0)