Skip to content

Commit 9bf0899

Browse files
author
Jessica Yung
committed
feat(ctci): add p2.1 solution and unit tests
1 parent 14dabd7 commit 9bf0899

File tree

6 files changed

+91
-27
lines changed

6 files changed

+91
-27
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
"""
2+
2.1 Remove Duplicates
3+
4+
Write code to remove duplicates from an unsorted linked list.
5+
6+
How would you solve this problem if a temporary buffer is not allowed?
7+
8+
Author: Jessica Yung
9+
15 October 2016
10+
"""
11+
import unittest
12+
13+
14+
class LinkedListNode(object):
15+
"""Singly Linked List Node"""
16+
17+
def __init__(self, value):
18+
super(LinkedListNode, self).__init__()
19+
self.value = value
20+
self.next = None
21+
22+
23+
def remove_duplicates(first_node):
24+
"""
25+
:type first_node: LinkedListNode
26+
"""
27+
28+
#
29+
set_of_values = set()
30+
previous_node = None
31+
current_node = first_node
32+
while current_node is not None:
33+
# If duplicate
34+
if current_node.value in set_of_values:
35+
# Remove node
36+
previous_node.next = current_node.next
37+
else:
38+
# If not duplicate, add value to set of values
39+
set_of_values.add(current_node.value)
40+
previous_node = current_node
41+
# Move to next node: update previous and current nodes
42+
current_node = current_node.next
43+
44+
45+
def remove_duplicates_no_temp_buffer(first_node):
46+
current_node = first_node
47+
while current_node is not None:
48+
runner_node = current_node
49+
while runner_node is not None:
50+
if runner_node.next.value == current_node.value:
51+
runner_node.next = runner_node.next.next
52+
else:
53+
runner_node = runner_node.next
54+
current_node = current_node.next
55+
56+
57+
class Test(unittest.TestCase):
58+
"""Test"""
59+
60+
def set_up_linked_list(self):
61+
a = LinkedListNode(1)
62+
b = LinkedListNode(2)
63+
c = LinkedListNode(3)
64+
d = LinkedListNode(2)
65+
e = LinkedListNode(4)
66+
f = LinkedListNode(3)
67+
g = LinkedListNode(5)
68+
a.next = b
69+
b.next = c
70+
c.next = d
71+
d.next = e
72+
e.next = f
73+
f.next = g
74+
return a
75+
76+
def test_remove_duplicates(self):
77+
a = self.set_up_linked_list()
78+
remove_duplicates(a)
79+
self.assertEqual(a, a)
80+
self.assertEqual(a.next.value, 2)
81+
self.assertEqual(a.next.next.next.value, 4)
82+
83+
def test_remove_duplicates_no_buffer(self):
84+
a = self.set_up_linked_list()
85+
remove_duplicates(a)
86+
self.assertEqual(a, a)
87+
self.assertEqual(a.next.value, 2)
88+
self.assertEqual(a.next.next.next.value, 4)
89+
90+
if __name__ == '__main__':
91+
unittest.main()

laakmann-mcdowell/2-linked-lists/2.1-remove-duplicates.py

Lines changed: 0 additions & 8 deletions
This file was deleted.

laakmann-mcdowell/2-linked-lists/2_return_kth_to_last.py

Whitespace-only changes.

laakmann-mcdowell/2-linked-lists/linked-lists-implementation.c

Lines changed: 0 additions & 19 deletions
This file was deleted.

0 commit comments

Comments
 (0)