adt_utilit 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b6af6922d287bcf52954bdaf9ba808109883652e
4
+ data.tar.gz: 3ced982a4a11dc086b532390cb855dd32abde1d6
5
+ SHA512:
6
+ metadata.gz: 4c8380a9e31dbf75bdf91f8444e36c650bcfa9fd1f55c7a17047ed9d0197d986399b2174140462341a05cfe3a99da5fd92c8477d5f3ede8845910b622173d70a
7
+ data.tar.gz: 36d70d84e451c2e4f022523d1c6371f92a3b6cbb08289ef56ee3f625c77b2790acf1ffc9d9fafe46b6b054f6edca87a9fcf5a0889f786d1b6e92cbbd786f8f46
@@ -0,0 +1,161 @@
1
+ require_relative 'linked_list_node.rb'
2
+ require "byebug"
3
+ class LinkedList
4
+ include Enumerable
5
+ attr_reader :length, :head, :tail
6
+
7
+ def initialize(value)
8
+ if value.is_a?(Array)
9
+ nodes = initialize_with_array(value)
10
+ elsif value.is_a?(Hash)
11
+ nodes = initialize_with_hash(value)
12
+ else
13
+ nodes = [LinkedListNode.new(value)]
14
+ end
15
+ @head = nodes[0]
16
+ @tail = nodes[-1]
17
+ @length = nodes.length
18
+ end
19
+
20
+ def each(&block)
21
+ i = 0
22
+ current_node = @head
23
+ while i < self.length
24
+ block.call(current_node)
25
+ current_node = current_node.next
26
+ i += 1
27
+ end
28
+ end
29
+
30
+ def [](idx)
31
+ if (idx >= 0)
32
+ current_node = @head
33
+ self.each_with_index do |node, llidx|
34
+ return node if idx == llidx
35
+ current_node = current_node.next
36
+ end
37
+ else
38
+ current_node = @tail
39
+ i = 0
40
+ while i < @length
41
+ return current_node if idx == -i - 1
42
+ current_node = current_node.prev
43
+ i += 1
44
+ end
45
+ end
46
+ nil
47
+ end
48
+
49
+ def push(value)
50
+ if value.is_a?(LinkedListNode)
51
+ node = value
52
+ else
53
+ node = LinkedListNode.new(value)
54
+ end
55
+ @tail.connect(node)
56
+ @tail = node
57
+ @length +=1
58
+ self
59
+ end
60
+
61
+ def unshift(value)
62
+ if value.is_a?(LinkedListNode)
63
+ node = value
64
+ else
65
+ node = LinkedListNode.new(value)
66
+ end
67
+ node.connect(@head)
68
+ @head = node
69
+ @length +=1
70
+ self
71
+ end
72
+
73
+ def pop
74
+ popped_node = @tail.remove
75
+ @length -= 1
76
+ @tail = @tail.prev
77
+ popped_node
78
+ end
79
+
80
+ def shift
81
+ shifted_node = @head.remove
82
+ @length -= 1
83
+ @head = @head.next
84
+ shifted_node
85
+ end
86
+
87
+ def find(value)
88
+ self.each do |node|
89
+ return node if node.value == value
90
+ end
91
+ nil
92
+ end
93
+
94
+ def find_all(value)
95
+ self.select{|node| node.value == value}
96
+ end
97
+
98
+ def insert(value, idx)
99
+ if value.is_a?(LinkedListNode)
100
+ node = value
101
+ else
102
+ node = LinkedListNode.new(value)
103
+ end
104
+
105
+ node.connect(self[idx])
106
+ self[idx-1].connect(node) if idx > 0
107
+ @head = node if idx == 0 || idx == -@length
108
+ @tail = node if idx == -1 || idx == @length - 1
109
+ @length += 1
110
+ end
111
+
112
+ def remove_at(idx)
113
+ removing_node = self[idx]
114
+ return nil if removing_node.nil?
115
+
116
+ removing_node.remove
117
+ @tail = removing_node.prev if idx == -1 || idx == @length-1
118
+ @head = removing_node.next if idx == 0 || idx == -@length
119
+ @length -= 1
120
+ idx
121
+ end
122
+
123
+ def remove_all(value)
124
+ found = false
125
+ current_node = @head
126
+ while current_node
127
+ if current_node.value == value
128
+ current_node.remove
129
+ @length -= 1
130
+ @head = current_node.next if current_node == @head
131
+ @tail = current_node.prev if current_node == @tail
132
+ found = true
133
+ end
134
+ current_node = current_node.next
135
+ end
136
+ found
137
+ end
138
+
139
+
140
+ private
141
+ def initialize_with_array(array)
142
+ nodes = []
143
+ array.map.with_index do |el, idx|
144
+ node = LinkedListNode.new(el)
145
+ nodes[-1].connect(node) unless nodes[-1].nil?
146
+ nodes << node
147
+ end
148
+ nodes
149
+ end
150
+
151
+ def initialize_with_hash(hash)
152
+ nodes = []
153
+ hash.map do |key, value|
154
+ node = LinkedListNode.new({key => value})
155
+ nodes[-1].connect(node) unless nodes[-1].nil?
156
+ nodes << node
157
+ end
158
+ nodes
159
+ end
160
+
161
+ end
@@ -0,0 +1,24 @@
1
+ class LinkedListNode
2
+ attr_accessor :value, :next, :prev
3
+
4
+ def initialize(value)
5
+ @value = value
6
+ @next = nil
7
+ @prev = nil
8
+ end
9
+
10
+ def connect(node)
11
+ self.next = node
12
+ node.prev = self unless node.nil?
13
+ end
14
+
15
+ def remove
16
+ if @prev.nil?
17
+ @next.prev = nil
18
+ else
19
+ @prev.connect(@next)
20
+ end
21
+ self
22
+ end
23
+
24
+ end
data/lib/adt_utilit.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'adt_utilit/linked_list'
2
+
3
+ class AdtUtilit
4
+
5
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adt_utilit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Hirosvk
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: still in development
14
+ email: kajino.hiroyuki@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/adt_utilit.rb
20
+ - lib/adt_utilit/linked_list.rb
21
+ - lib/adt_utilit/linked_list_node.rb
22
+ homepage: http://rubygems.org/gems/adt_utilit
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 2.5.1
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: ADT Utilities
46
+ test_files: []