Skip to content

Commit 7d4c838

Browse files
committed
fix: fix C02_P01 to set tail so .add works
closes #65
1 parent 24441f0 commit 7d4c838

File tree

4 files changed

+59
-35
lines changed

4 files changed

+59
-35
lines changed

chapter_02/linked_list.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from random import randint
1+
import random
22

33

44
class LinkedListNode:
5-
def __init__(self, value, nextNode=None, prevNode=None):
5+
def __init__(self, value, next_node=None, prev_node=None):
66
self.value = value
7-
self.next = nextNode
8-
self.prev = prevNode
7+
self.next = next_node
8+
self.prev = prev_node
99

1010
def __str__(self):
1111
return str(self.value)
@@ -36,6 +36,9 @@ def __len__(self):
3636
node = node.next
3737
return result
3838

39+
def values(self):
40+
return [x.value for x in self]
41+
3942
def add(self, value):
4043
if self.head is None:
4144
self.tail = self.head = LinkedListNode(value)
@@ -55,11 +58,9 @@ def add_multiple(self, values):
5558
for v in values:
5659
self.add(v)
5760

58-
def generate(self, n, min_value, max_value):
59-
self.head = self.tail = None
60-
for i in range(n):
61-
self.add(randint(min_value, max_value))
62-
return self
61+
@classmethod
62+
def generate(cls, k, min_value, max_value):
63+
return cls(random.choices(range(min_value, max_value), k=k))
6364

6465

6566
class DoublyLinkedList(LinkedList):

chapter_02/p01_remove_dups.py

+45-19
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
1-
from .linked_list import LinkedList
1+
import time
22

3+
from chapter_02.linked_list import LinkedList
34

4-
def remove_dups(ll):
5-
if ll.head is None:
6-
return
75

6+
def remove_dups(ll):
87
current = ll.head
9-
seen = set([current.value])
10-
while current.next:
11-
if current.next.value in seen:
12-
current.next = current.next.next
13-
else:
14-
seen.add(current.next.value)
15-
current = current.next
8+
previous = None
9+
seen = set()
1610

11+
while current:
12+
if current.value in seen:
13+
previous.next = current.next
14+
else:
15+
seen.add(current.value)
16+
previous = current
17+
current = current.next
18+
ll.tail = previous
1719
return ll
1820

1921

2022
def remove_dups_followup(ll):
21-
if ll.head is None:
22-
return
23-
24-
current = ll.head
23+
runner = current = ll.head
2524
while current:
2625
runner = current
2726
while runner.next:
@@ -30,18 +29,45 @@ def remove_dups_followup(ll):
3029
else:
3130
runner = runner.next
3231
current = current.next
32+
ll.tail = runner
33+
return ll
34+
35+
36+
testable_functions = (remove_dups, remove_dups_followup)
37+
test_cases = (
38+
([], []),
39+
([1, 1, 1, 1, 1, 1], [1]),
40+
([1, 2, 3, 2], [1, 2, 3]),
41+
([1, 2, 2, 3], [1, 2, 3]),
42+
([1, 1, 2, 3], [1, 2, 3]),
43+
([1, 2, 3], [1, 2, 3]),
44+
)
45+
46+
47+
def test_remove_dupes():
48+
for f in testable_functions:
49+
start = time.perf_counter()
50+
for _ in range(100):
51+
for values, expected in test_cases:
52+
expected = expected.copy()
53+
deduped = f(LinkedList(values))
54+
assert deduped.values() == expected
55+
56+
deduped.add(5)
57+
expected.append(5)
58+
assert deduped.values() == expected
3359

34-
return ll.head
60+
duration = time.perf_counter() - start
61+
print(f"{f.__name__} {duration * 1000:.1f}ms")
3562

3663

3764
if __name__ == "__main__":
38-
ll = LinkedList()
39-
ll.generate(100, 0, 9)
65+
ll = LinkedList.generate(100, 0, 9)
4066
print(ll)
4167
remove_dups(ll)
4268
print(ll)
4369

44-
ll.generate(100, 0, 9)
70+
ll = LinkedList.generate(100, 0, 9)
4571
print(ll)
4672
remove_dups_followup(ll)
4773
print(ll)

chapter_02/p04_partition.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .linked_list import LinkedList
1+
from chapter_02.linked_list import LinkedList
22

33

44
def partition(ll, x):
@@ -21,8 +21,7 @@ def partition(ll, x):
2121

2222

2323
if __name__ == "__main__":
24-
ll = LinkedList()
25-
ll.generate(10, 0, 99)
24+
ll = LinkedList.generate(10, 0, 99)
2625
print(ll)
2726
partition(ll, ll.head.value)
2827
print(ll)

chapter_02/p05_sum_lists.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ def sum_lists_followup(ll_a, ll_b):
4848

4949

5050
if __name__ == "__main__":
51-
ll_a = LinkedList()
52-
ll_a.generate(4, 0, 9)
53-
ll_b = LinkedList()
54-
ll_b.generate(3, 0, 9)
51+
ll_a = LinkedList.generate(4, 0, 9)
52+
ll_b = LinkedList.generate(3, 0, 9)
5553
print(ll_a)
5654
print(ll_b)
5755
print(sum_lists(ll_a, ll_b))

0 commit comments

Comments
 (0)