Design Linked List LeetCode solution in Python

1
class Node:
2
def __init__(self, val: int):
3
self.val = val
4
self.next = None
5
self.prev = None
6

7

8
class MyLinkedList:
9
def __init__(self):
10
self.head = Node(0)
11
self.tail = Node(0)
12
self.head.next = self.tail
13
self.tail.prev = self.head
14
self.size = 0
15

16
def get(self, index: int) -> int:
17
if index < 0 or index >= self.size:
18
return -1
19
# Distance of index is closer to head
20
if index + 1 < self.size - index:
21
curr = self.head
22
for i in range(index + 1):
23
curr = curr.next
24
# Distance of index is closer to tail
25
else:
26
curr = self.tail
27
for i in range(self.size - index):
28
curr = curr.prev
29
return curr.val
30

31
def addAtHead(self, val: int) -> None:
32
curr = Node(val)
33
prevNode = self.head
34
nextNode = self.head.next
35
self.size += 1
36
curr.prev = prevNode
37
curr.next = nextNode
38
prevNode.next = curr
39
nextNode.prev = curr
40

41
def addAtTail(self, val: int) -> None:
42
curr = Node(val)
43
prevNode = self.tail.prev
44
nextNode = self.tail
45
self.size += 1
46
curr.prev = prevNode
47
curr.next = nextNode
48
prevNode.next = curr
49
nextNode.prev = curr
50

51
def addAtIndex(self, index: int, val: int) -> None:
52
curr = Node(val)
53
if index > self.size:
54
return
55
if index < 0:
56
index = 0
57
if index < self.size - index:
58
prevNode = self.head
59
for i in range(index):
60
prevNode = prevNode.next
61
nextNode = prevNode.next
62
else:
63
nextNode = self.tail
64
for i in range(self.size - index):
65
nextNode = nextNode.prev
66
prevNode = nextNode.prev
67
self.size += 1
68
curr.prev = prevNode
69
curr.next = nextNode
70
prevNode.next = curr
71
nextNode.prev = curr
72

73
def deleteAtIndex(self, index: int) -> None:
74
if index < 0 or index >= self.size:
75
return
76
if index < self.size - index:
77
prevNode = self.head
78
for i in range(index):
79
prevNode = prevNode.next
80
nextNode = prevNode.next.next
81
else:
82
nextNode = self.tail
83
for i in range(self.size - index - 1):
84
nextNode = nextNode.prev
85
prevNode = nextNode.prev.prev
86
self.size -= 1
87
prevNode.next = nextNode
88
nextNode.prev = prevNode
89

90

91
# Your MyLinkedList object will be instantiated and called as such:
92
# obj = MyLinkedList()
93
# param_1 = obj.get(index)
94
# obj.addAtHead(val)
95
# obj.addAtTail(val)
96
# obj.addAtIndex(index,val)
97
# obj.deleteAtIndex(index)

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0