adt_utilit 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []