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 +7 -0
- data/lib/adt_utilit/linked_list.rb +161 -0
- data/lib/adt_utilit/linked_list_node.rb +24 -0
- data/lib/adt_utilit.rb +5 -0
- metadata +46 -0
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
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: []
|