|
1 |
| -# https://www.algoexpert.io/questions/Linked%20List%20Construction |
2 |
| -# Write a class for a Doubly Linked List. |
3 |
| - |
4 |
| - |
5 |
| -# Definition for doubly-linked list node. |
6 |
| -# class ListNode(object): |
7 |
| -# def __init__(self, x): |
8 |
| -# self.val = x |
9 |
| -# self.next = None |
10 |
| -# self.prev = prev |
11 |
| - |
12 |
| -class DoublyLinkedList: |
13 |
| - |
14 |
| - def __init__(self): |
15 |
| - self.head = None |
16 |
| - self.tail = None |
17 |
| - |
18 |
| - # O(1) time | O(1) space |
19 |
| - def set_head(self, node): |
20 |
| - if self.head is None: |
21 |
| - self.head = node |
22 |
| - self.tail = node |
23 |
| - return |
24 |
| - self.insert_before(self.head, node) |
25 |
| - |
26 |
| - # O(1) time | O(1) space |
27 |
| - def set_tail(self, node): |
28 |
| - if self.tail is None: |
29 |
| - self.set_head(node) |
30 |
| - return |
31 |
| - self.insert_after(self.tail, node) |
32 |
| - |
33 |
| - # O(1) time | O(1) space |
34 |
| - def insert_before(self, node, node_to_insert): |
35 |
| - if node_to_insert == self.head and node_to_insert == self.tail: |
36 |
| - return |
37 |
| - self.remove(node_to_insert) |
38 |
| - node_to_insert.prev = node.prev |
39 |
| - node_to_insert.next = node |
40 |
| - if node.prev is None: |
41 |
| - self.head = node_to_insert |
42 |
| - else: |
43 |
| - node.prev.next = node_to_insert |
44 |
| - node.prev = node_to_insert |
45 |
| - |
46 |
| - # O(1) time | O(1) space |
47 |
| - def insert_after(self, node, node_to_insert): |
48 |
| - if node_to_insert == self.head and node_to_insert == self.tail: |
49 |
| - return |
50 |
| - self.remove(node_to_insert) |
51 |
| - node_to_insert.prev = node |
52 |
| - node_to_insert.next = node.next |
53 |
| - if node.next is None: |
54 |
| - self.tail = node_to_insert |
55 |
| - else: |
56 |
| - node.next.prev = node_to_insert |
57 |
| - node.next = node_to_insert |
58 |
| - |
59 |
| - # O(p) time | O(1) space |
60 |
| - def insert_at_position(self, position, node_to_insert): |
61 |
| - if position == 1: |
62 |
| - self.set_head(node_to_insert) |
63 |
| - return |
64 |
| - node = self.head |
65 |
| - current_position = 1 |
66 |
| - while node is not None and current_position != position: |
67 |
| - node = node.next |
68 |
| - current_position += 1 |
69 |
| - if node is not None: |
70 |
| - self.insert_before(node, node_to_insert) |
71 |
| - else: |
72 |
| - self.set_tail(node) |
73 |
| - |
74 |
| - # O(n) time | O(1) space |
75 |
| - def remove_nodes_with_value(self, value): |
76 |
| - node = self.head |
77 |
| - while node is not None: |
78 |
| - node_to_remove = node |
79 |
| - node = node.next |
80 |
| - if node_to_remove.value == value: |
81 |
| - self.remove(node_to_remove) |
82 |
| - |
83 |
| - # O(1) time | O(1) space |
84 |
| - def remove(self, node): |
85 |
| - if node == self.head: |
86 |
| - self.head = self.head.next |
87 |
| - if node == self.tail: |
88 |
| - self.tail = self.tail.prev |
89 |
| - self.remove_node_bindings(node) |
90 |
| - |
91 |
| - def contains_node_with_value(self, value): |
92 |
| - node = self.head |
93 |
| - while node is not None and node.value != value: |
94 |
| - node = node.next |
95 |
| - return node is not None |
96 |
| - |
97 |
| - def remove_node_bindings(self, node): |
98 |
| - if node.prev is not None: |
99 |
| - node.prev.next = node.next |
100 |
| - if node.next is not None: |
101 |
| - node.next.prev = node.prev |
102 |
| - node.next = None |
103 |
| - node.prev = None |
104 |
| - |
105 |
| - |
106 |
| - |
107 |
| -# ------------------------------------- |
108 |
| - |
109 |
| - |
| 1 | +# This is an input class. Do not edit. |
110 | 2 | class Node:
|
111 | 3 | def __init__(self, value):
|
112 | 4 | self.value = value
|
113 | 5 | self.prev = None
|
114 | 6 | self.next = None
|
115 | 7 |
|
116 | 8 |
|
| 9 | +# Code is OK but test cases are failing. DOn't know why |
117 | 10 | class DoublyLinkedList:
|
118 | 11 | def __init__(self):
|
119 | 12 | self.head = None
|
120 | 13 | self.tail = None
|
121 | 14 |
|
122 |
| - # O(1) time | O(1) space |
123 | 15 | def setHead(self, node):
|
124 | 16 | if self.head is None:
|
125 | 17 | self.head = node
|
126 | 18 | self.tail = node
|
127 | 19 | return
|
128 | 20 | self.insertBefore(self.head, node)
|
129 | 21 |
|
130 |
| - # O(1) time | O(1) space |
131 | 22 | def setTail(self, node):
|
132 | 23 | if self.tail is None:
|
133 | 24 | self.setHead(node)
|
134 | 25 | return
|
135 | 26 | self.insertAfter(self.tail, node)
|
136 | 27 |
|
137 |
| - # O(1) time | O(1) space |
138 | 28 | def insertBefore(self, node, nodeToInsert):
|
139 | 29 | if nodeToInsert == self.head and nodeToInsert == self.tail:
|
140 | 30 | return
|
141 | 31 | self.remove(nodeToInsert)
|
142 | 32 | nodeToInsert.prev = node.prev
|
143 | 33 | nodeToInsert.next = node
|
144 |
| - if node.prev is None: |
| 34 | + if not node.prev: |
145 | 35 | self.head = nodeToInsert
|
146 | 36 | else:
|
147 | 37 | node.prev.next = nodeToInsert
|
148 | 38 | node.prev = nodeToInsert
|
149 | 39 |
|
150 |
| - # O(1) time | O(1) space |
151 | 40 | def insertAfter(self, node, nodeToInsert):
|
152 | 41 | if nodeToInsert == self.head and nodeToInsert == self.tail:
|
153 | 42 | return
|
154 | 43 | self.remove(nodeToInsert)
|
155 | 44 | nodeToInsert.prev = node
|
156 | 45 | nodeToInsert.next = node.next
|
157 |
| - if node.next is None: |
| 46 | + if not node.next: |
158 | 47 | self.tail = nodeToInsert
|
159 | 48 | else:
|
160 | 49 | node.next.prev = nodeToInsert
|
161 | 50 | node.next = nodeToInsert
|
162 | 51 |
|
163 |
| - # O(p) time | O(1) space |
164 | 52 | def insertAtPosition(self, position, nodeToInsert):
|
165 | 53 | if position == 1:
|
166 | 54 | self.setHead(nodeToInsert)
|
167 | 55 | return
|
168 | 56 | node = self.head
|
169 |
| - currentPosition = 1 |
170 |
| - while node is not None and currentPosition != position: |
| 57 | + currPos = 1 |
| 58 | + while node and currPos != position: |
171 | 59 | node = node.next
|
172 |
| - currentPosition += 1 |
173 |
| - if node is not None: |
174 |
| - self.insertBefore(node, nodeToInsert) |
| 60 | + currPos += 1 |
| 61 | + if node: |
| 62 | + self.insertBefore(nodeToInsert) |
175 | 63 | else:
|
176 | 64 | self.setTail(nodeToInsert)
|
177 | 65 |
|
178 |
| - # O(n) time | O(1) space |
179 |
| - |
180 | 66 | def removeNodesWithValue(self, value):
|
181 | 67 | node = self.head
|
182 |
| - while node is not None: |
| 68 | + while node: |
183 | 69 | nodeToRemove = node
|
184 | 70 | node = node.next
|
185 | 71 | if nodeToRemove.value == value:
|
186 | 72 | self.remove(nodeToRemove)
|
187 | 73 |
|
188 |
| - # O(1) time | O(1) space |
189 | 74 | def remove(self, node):
|
190 | 75 | if node == self.head:
|
191 | 76 | self.head = self.head.next
|
192 | 77 | if node == self.tail:
|
193 | 78 | self.tail = self.tail.prev
|
194 | 79 | self.removeNodeBindings(node)
|
195 | 80 |
|
196 |
| - # O(n) time | O(1) space |
197 | 81 | def containsNodeWithValue(self, value):
|
198 | 82 | node = self.head
|
199 |
| - while node is not None and node.value != value: |
| 83 | + while node and node.value != value: |
200 | 84 | node = node.next
|
201 | 85 | return node is not None
|
202 | 86 |
|
203 | 87 | def removeNodeBindings(self, node):
|
204 |
| - if node.prev is not None: |
| 88 | + if node.prev: |
205 | 89 | node.prev.next = node.next
|
206 |
| - if node.next is not None: |
| 90 | + if node.next: |
207 | 91 | node.next.prev = node.prev
|
208 | 92 | node.prev = None
|
209 | 93 | node.next = None
|
210 |
| - |
211 |
| - |
212 |
| -# ------------------ |
213 |
| -# This is an input class. Do not edit. |
214 |
| -class Node: |
215 |
| - def __init__(self, value): |
216 |
| - self.value = value |
217 |
| - self.prev = None |
218 |
| - self.next = None |
219 |
| - |
220 |
| - |
221 |
| -# Feel free to add new properties and methods to the class. |
222 |
| -class DoublyLinkedList: |
223 |
| - def __init__(self): |
224 |
| - self.head = None |
225 |
| - self.tail = None |
226 |
| - |
227 |
| - def setHead(self, node): |
228 |
| - # Write your code here. |
229 |
| - pass |
230 |
| - |
231 |
| - def setTail(self, node): |
232 |
| - # Write your code here. |
233 |
| - pass |
234 |
| - |
235 |
| - def insertBefore(self, node, nodeToInsert): |
236 |
| - # Write your code here. |
237 |
| - pass |
238 |
| - |
239 |
| - def insertAfter(self, node, nodeToInsert): |
240 |
| - # Write your code here. |
241 |
| - pass |
242 |
| - |
243 |
| - def insertAtPosition(self, position, nodeToInsert): |
244 |
| - # Write your code here. |
245 |
| - pass |
246 |
| - |
247 |
| - def removeNodesWithValue(self, value): |
248 |
| - # Write your code here. |
249 |
| - pass |
250 |
| - |
251 |
| - def remove(self, node): |
252 |
| - # Write your code here. |
253 |
| - pass |
254 |
| - |
255 |
| - def containsNodeWithValue(self, value): |
256 |
| - # Write your code here. |
257 |
| - pass |
0 commit comments