|
| 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