Skip to content

Commit 39ce8f3

Browse files
authored
Create design-linked-list.py
1 parent 6c8876f commit 39ce8f3

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed

Python/design-linked-list.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Time: O(n)
2+
# Space: O(n)
3+
4+
class Node:
5+
def __init__(self, value):
6+
self.val = value
7+
self.next = self.prev = None
8+
9+
10+
class MyLinkedList(object):
11+
12+
def __init__(self):
13+
"""
14+
Initialize your data structure here.
15+
"""
16+
self.__head = self.__tail = Node(-1)
17+
self.__head.next = self.__tail
18+
self.__tail.prev = self.__head
19+
self.__size = 0
20+
21+
def get(self, index):
22+
"""
23+
Get the value of the index-th node in the linked list. If the index is invalid, return -1.
24+
:type index: int
25+
:rtype: int
26+
"""
27+
if 0 <= index <= self.__size // 2:
28+
return self.__forward(0, index, self.__head.next).val
29+
elif self.__size // 2 < index < self.__size:
30+
return self.__backward(self.__size, index, self.__tail).val
31+
return -1
32+
33+
def addAtHead(self, val):
34+
"""
35+
Add a node of value val before the first element of the linked list.
36+
After the insertion, the new node will be the first node of the linked list.
37+
:type val: int
38+
:rtype: void
39+
"""
40+
self.__add(self.__head, val)
41+
42+
def addAtTail(self, val):
43+
"""
44+
Append a node of value val to the last element of the linked list.
45+
:type val: int
46+
:rtype: void
47+
"""
48+
self.__add(self.__tail.prev, val)
49+
50+
def addAtIndex(self, index, val):
51+
"""
52+
Add a node of value val before the index-th node in the linked list.
53+
If index equals to the length of linked list,
54+
the node will be appended to the end of linked list.
55+
If index is greater than the length, the node will not be inserted.
56+
:type index: int
57+
:type val: int
58+
:rtype: void
59+
"""
60+
if 0 <= index <= self.__size // 2:
61+
self.__add(self.__forward(0, index, self.__head.next).prev, val)
62+
elif self.__size // 2 < index <= self.__size:
63+
self.__add(self.__backward(self.__size, index, self.__tail).prev, val)
64+
65+
def deleteAtIndex(self, index):
66+
"""
67+
Delete the index-th node in the linked list, if the index is valid.
68+
:type index: int
69+
:rtype: void
70+
"""
71+
if 0 <= index <= self.__size // 2:
72+
self.__remove(self.__forward(0, index, self.__head.next))
73+
elif self.__size // 2 < index < self.__size:
74+
self.__remove(self.__backward(self.__size, index, self.__tail))
75+
76+
def __add(self, preNode, val):
77+
node = Node(val)
78+
node.prev = preNode
79+
node.next = preNode.next
80+
node.prev.next = node.next.prev = node
81+
self.__size += 1
82+
83+
def __remove(self, node):
84+
node.prev.next = node.next
85+
node.next.prev = node.prev
86+
self.__size -= 1
87+
88+
def __forward(self, start, end, curr):
89+
while start != end:
90+
start += 1
91+
curr = curr.next
92+
return curr
93+
94+
def __backward(self, start, end, curr):
95+
while start != end:
96+
start -= 1
97+
curr = curr.prev
98+
return curr
99+
100+
101+
# Your MyLinkedList object will be instantiated and called as such:
102+
# obj = MyLinkedList()
103+
# param_1 = obj.get(index)
104+
# obj.addAtHead(val)
105+
# obj.addAtTail(val)
106+
# obj.addAtIndex(index,val)
107+
# obj.deleteAtIndex(index)

0 commit comments

Comments
 (0)