-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2.1.2_remove_dups.rb
80 lines (62 loc) · 1.47 KB
/
2.1.2_remove_dups.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# frozen_string_literal: true
# Write code to remove duplicates from an unsorted linked list.
# How would you solve this problem if a temporary buffer is not allowed?
require_relative '../test_helper'
require 'set'
Node = Struct.new('Node', :value, :next)
class LinkedList
def initialize(head)
@head = head
end
def dedup
node = head
runner = nil
previous = nil
while node
runner = node.next
previous = node
while runner
previous.next = runner.next if node.value == runner.value
runner = runner.next
previous = previous.next
end
node = node.next
end
head
end
private
attr_reader :head
end
class TestStringRotate < Minitest::Test
def test_1
i2 = Node.new(3)
i1 = Node.new(2, i2)
i0 = Node.new(1, i1)
assert_equal i0, LinkedList.new(i0).dedup
assert_equal i1, i0.next
assert_equal i2, i1.next
assert_nil i2.next
end
def test_2
i4 = Node.new(12)
i3 = Node.new(1, i4)
i2 = Node.new(4, i3)
i1 = Node.new(1, i2)
i0 = Node.new(8, i1)
assert_equal i0, LinkedList.new(i0).dedup
assert_equal i1, i0.next
assert_equal i2, i1.next
assert_equal i4, i2.next
assert_nil i4.next
end
def test_3
i3 = Node.new(7)
i2 = Node.new(2, i3)
i1 = Node.new(12, i2)
i0 = Node.new(7, i1)
assert_equal i0, LinkedList.new(i0).dedup
assert_equal i1, i0.next
assert_equal i2, i1.next
assert_nil i2.next
end
end