Skip to content

Commit de357a4

Browse files
committed
add size to ll, O(1) space, raise idx error, restructure tests
1 parent 5c8d9ef commit de357a4

File tree

1 file changed

+26
-63
lines changed

1 file changed

+26
-63
lines changed

Python/chapter02/2.2 - Return Kth to Last/miguel_2.2_soln.py

Lines changed: 26 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,25 @@ class LinkedList:
3232
def __init__(self, *numbers: int):
3333
self.head = None
3434
self.tail = None
35+
self.size = 0
3536
for num in numbers:
3637
self.append_to_tail(num)
3738

3839
def append_to_tail(self, d: int) -> None:
3940
if self.head is None:
4041
self.head = Node(d)
4142
self.tail = self.head
42-
return
43-
end = Node(d)
44-
self.tail.next = end
45-
self.tail = end
43+
else:
44+
end = Node(d)
45+
self.tail.next = end
46+
self.tail = end
47+
self.size += 1
4648

4749
def append_to_head(self, d: int) -> None:
4850
new_head = Node(d)
4951
new_head.next = self.head
5052
self.head = new_head
53+
self.size += 1
5154

5255
def __repr__(self):
5356
return self.__str__()
@@ -84,79 +87,39 @@ def kth_to_last(ll: LinkedList, k: int) -> Node:
8487
Going to reverse the linked list and then
8588
count k steps.
8689
Runtime: O(N)
87-
Space Complexity: O(N)
90+
Space Complexity: O(1)
8891
:param ll: a linked list
89-
:param k: an integer where k >= 0
92+
:param k:
93+
an integer where k > 0 and k < ll size
9094
:return:
9195
kth to last Node from the linked list
9296
or None
9397
"""
94-
if k <= 0:
95-
return None
96-
# build reversed linked list
97-
reversed_ll = LinkedList(ll.head.data)
98-
n = ll.head.next
99-
while n is not None:
100-
reversed_ll.append_to_head(n.data)
101-
n = n.next
102-
# go k steps
98+
if k <= 0 or k > ll.size:
99+
raise IndexError('list index out of range')
100+
# go size - k steps
101+
n = ll.head
103102
i = 1
104-
n = reversed_ll.head
105-
while n is not None and i < k:
103+
while n is not None and i <= ll.size - k:
106104
n = n.next
107105
i += 1
108106
return n
109107

110108

111109
class TestKthToLast(unittest.TestCase):
112110

113-
def setUp(self):
114-
self.test_cases = [
115-
(
116-
LinkedList(1, 2, 3, 4, 5, 6),
117-
2,
118-
Node(5)
119-
),
120-
(
121-
LinkedList(1, 2, 3, 4, 5, 6),
122-
1,
123-
Node(6)
124-
),
125-
(
126-
LinkedList(1, 2, 3, 4, 5, 6),
127-
4,
128-
Node(3)
129-
),
130-
(
131-
LinkedList(1, 2, 3, 4, 5, 6),
132-
5,
133-
Node(2)
134-
),
135-
(
136-
LinkedList(1, 2, 3, 4, 5, 6),
137-
6,
138-
Node(1)
139-
),
140-
(
141-
LinkedList(1, 2, 3, 4, 5, 6),
142-
7,
143-
None
144-
),
145-
(
146-
LinkedList(1),
147-
1,
148-
Node(1)
149-
),
150-
(
151-
LinkedList(5),
152-
0,
153-
None
154-
),
155-
]
156-
157111
def test_kth_to_last(self):
158-
for ll, k, expected in self.test_cases:
159-
self.assertEqual(kth_to_last(ll, k), expected, msg=(ll, expected))
112+
l = list(range(1, 6))
113+
ll = LinkedList(*l)
114+
for k in range(1, len(l)):
115+
self.assertEqual(kth_to_last(ll, k), Node(l[-k]), msg=(ll, l[-k]))
116+
117+
def test_kth_to_last_index_error(self):
118+
k_values = [-1, 7, 0]
119+
ll = LinkedList(1, 2, 3)
120+
for k in k_values:
121+
with self.assertRaises(IndexError, msg=(ll, k)):
122+
kth_to_last(ll, k)
160123

161124

162125
if __name__ == '__main__':

0 commit comments

Comments
 (0)