Skip to content

Commit 55ee273

Browse files
Jiang15Jiang15
and
Jiang15
authored
[bug fixing] Edge case of the double ended queue (TheAlgorithms#9823)
* fix the edge case of the double ended queue pop the last element * refactoring doc --------- Co-authored-by: Jiang15 <[email protected]>
1 parent 6643c95 commit 55ee273

File tree

1 file changed

+45
-17
lines changed

1 file changed

+45
-17
lines changed

data_structures/queue/double_ended_queue.py

+45-17
Original file line numberDiff line numberDiff line change
@@ -242,31 +242,45 @@ def pop(self) -> Any:
242242
Removes the last element of the deque and returns it.
243243
Time complexity: O(1)
244244
@returns topop.val: the value of the node to pop.
245-
>>> our_deque = Deque([1, 2, 3, 15182])
246-
>>> our_popped = our_deque.pop()
247-
>>> our_popped
245+
>>> our_deque1 = Deque([1])
246+
>>> our_popped1 = our_deque1.pop()
247+
>>> our_popped1
248+
1
249+
>>> our_deque1
250+
[]
251+
252+
>>> our_deque2 = Deque([1, 2, 3, 15182])
253+
>>> our_popped2 = our_deque2.pop()
254+
>>> our_popped2
248255
15182
249-
>>> our_deque
256+
>>> our_deque2
250257
[1, 2, 3]
258+
251259
>>> from collections import deque
252260
>>> deque_collections = deque([1, 2, 3, 15182])
253261
>>> collections_popped = deque_collections.pop()
254262
>>> collections_popped
255263
15182
256264
>>> deque_collections
257265
deque([1, 2, 3])
258-
>>> list(our_deque) == list(deque_collections)
266+
>>> list(our_deque2) == list(deque_collections)
259267
True
260-
>>> our_popped == collections_popped
268+
>>> our_popped2 == collections_popped
261269
True
262270
"""
263271
# make sure the deque has elements to pop
264272
assert not self.is_empty(), "Deque is empty."
265273

266274
topop = self._back
267-
self._back = self._back.prev_node # set new back
268-
# drop the last node - python will deallocate memory automatically
269-
self._back.next_node = None
275+
# if only one element in the queue: point the front and back to None
276+
# else remove one element from back
277+
if self._front == self._back:
278+
self._front = None
279+
self._back = None
280+
else:
281+
self._back = self._back.prev_node # set new back
282+
# drop the last node, python will deallocate memory automatically
283+
self._back.next_node = None
270284

271285
self._len -= 1
272286

@@ -277,11 +291,17 @@ def popleft(self) -> Any:
277291
Removes the first element of the deque and returns it.
278292
Time complexity: O(1)
279293
@returns topop.val: the value of the node to pop.
280-
>>> our_deque = Deque([15182, 1, 2, 3])
281-
>>> our_popped = our_deque.popleft()
282-
>>> our_popped
294+
>>> our_deque1 = Deque([1])
295+
>>> our_popped1 = our_deque1.pop()
296+
>>> our_popped1
297+
1
298+
>>> our_deque1
299+
[]
300+
>>> our_deque2 = Deque([15182, 1, 2, 3])
301+
>>> our_popped2 = our_deque2.popleft()
302+
>>> our_popped2
283303
15182
284-
>>> our_deque
304+
>>> our_deque2
285305
[1, 2, 3]
286306
>>> from collections import deque
287307
>>> deque_collections = deque([15182, 1, 2, 3])
@@ -290,17 +310,23 @@ def popleft(self) -> Any:
290310
15182
291311
>>> deque_collections
292312
deque([1, 2, 3])
293-
>>> list(our_deque) == list(deque_collections)
313+
>>> list(our_deque2) == list(deque_collections)
294314
True
295-
>>> our_popped == collections_popped
315+
>>> our_popped2 == collections_popped
296316
True
297317
"""
298318
# make sure the deque has elements to pop
299319
assert not self.is_empty(), "Deque is empty."
300320

301321
topop = self._front
302-
self._front = self._front.next_node # set new front and drop the first node
303-
self._front.prev_node = None
322+
# if only one element in the queue: point the front and back to None
323+
# else remove one element from front
324+
if self._front == self._back:
325+
self._front = None
326+
self._back = None
327+
else:
328+
self._front = self._front.next_node # set new front and drop the first node
329+
self._front.prev_node = None
304330

305331
self._len -= 1
306332

@@ -432,3 +458,5 @@ def __repr__(self) -> str:
432458
import doctest
433459

434460
doctest.testmod()
461+
dq = Deque([3])
462+
dq.pop()

0 commit comments

Comments
 (0)