linked-list 0.0.12 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +38 -0
- data/lib/linked-list/list.rb +14 -44
- data/lib/linked-list/version.rb +1 -1
- data/linked-list.gemspec +2 -2
- data/test/list_test.rb +80 -0
- metadata +16 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dff645cd01380ea68e75dd61a217a9c217a76eb229dc87817caab297444619d7
|
4
|
+
data.tar.gz: cbb85a2893c007c17729a3335b9ea9dd65ae9fd6b7f7a83ce4289fa024b21499
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8085a108cc3ac4a8edeea3585a0fd0c8adf1639e450d9d6f33e42b8002c3c1d0bd6a4fd6f88ff8b957075b36ff97bf236ed705446f6536ce029ba59c4f16d867
|
7
|
+
data.tar.gz: 44feefe384c7420d01bba47b31c9ebc825097d672250b0c0a5a5f1615e2c031678b086631bfab05180da05a560757146657fcfeac30f360163f6b08cd4c43f49
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,41 @@
|
|
1
|
+
# 0.0.x / Unreleased
|
2
|
+
|
3
|
+
# 0.0.16 / 2021-09-21
|
4
|
+
|
5
|
+
## Fixed
|
6
|
+
|
7
|
+
- Fixed bug when reference to prev node was not set correctly аfter using `shift`.
|
8
|
+
|
9
|
+
[Compare v0.0.15...v0.0.16](https://github.com/spectator/linked-list/compare/v0.0.15...v0.0.16)
|
10
|
+
|
11
|
+
# 0.0.15 / 2020-05-26
|
12
|
+
|
13
|
+
## Fixed
|
14
|
+
|
15
|
+
- Fixed bug when deleting the last node of the list. The @tail value was not updated if the @head value was updated.
|
16
|
+
|
17
|
+
[Compare v0.0.14...v0.0.15](https://github.com/spectator/linked-list/compare/v0.0.14...v0.0.15)
|
18
|
+
|
19
|
+
# 0.0.14 / 2020-04-17
|
20
|
+
|
21
|
+
## Fixed
|
22
|
+
|
23
|
+
Forced minimal rake version in gemspec to skip rake versions with security issues.
|
24
|
+
|
25
|
+
[Compare v0.0.13...v0.0.14](https://github.com/spectator/linked-list/compare/v0.0.13...v0.0.14)
|
26
|
+
|
27
|
+
# 0.0.13 / 2018-11-27
|
28
|
+
|
29
|
+
## Fixed
|
30
|
+
|
31
|
+
- Delete duplicate method definitions (nex3 in [#7](https://github.com/spectator/linked-list/pull/7))
|
32
|
+
|
33
|
+
## Added
|
34
|
+
|
35
|
+
- Allow `List#delete` to delete a `Node` in O(1) time (nex3 in [#6](https://github.com/spectator/linked-list/pull/6))
|
36
|
+
|
37
|
+
[Compare v0.0.12...v0.0.13](https://github.com/spectator/linked-list/compare/v0.0.12...v0.0.13)
|
38
|
+
|
1
39
|
# 0.0.12 / 2018-09-04
|
2
40
|
|
3
41
|
## Added
|
data/lib/linked-list/list.rb
CHANGED
@@ -130,10 +130,19 @@ module LinkedList
|
|
130
130
|
|
131
131
|
# Removes first matched node.data from the the list by passed block or value.
|
132
132
|
#
|
133
|
+
# If +val+ is a +Node+, removes that node from the list. Behavior is
|
134
|
+
# undefined if +val+ is a +Node+ that's not a member of this list.
|
135
|
+
#
|
133
136
|
# == Returns:
|
134
|
-
# Deleted node
|
137
|
+
# Deleted node's data
|
135
138
|
#
|
136
139
|
def delete(val = nil, &block)
|
140
|
+
if val.respond_to?(:to_node)
|
141
|
+
node = val.to_node
|
142
|
+
__unlink_node(node)
|
143
|
+
return node.data
|
144
|
+
end
|
145
|
+
|
137
146
|
each_node.find(&__to_matcher(val, &block)).tap do |node_to_delete|
|
138
147
|
return unless node_to_delete
|
139
148
|
__unlink_node(node_to_delete)
|
@@ -274,61 +283,22 @@ module LinkedList
|
|
274
283
|
self
|
275
284
|
end
|
276
285
|
|
277
|
-
# Inserts data after passed node.
|
278
|
-
#
|
279
|
-
# == Returns:
|
280
|
-
# Inserted node
|
281
|
-
#
|
282
|
-
def insert_after_node(data, node)
|
283
|
-
Node(data).tap do |new_node|
|
284
|
-
new_node.prev = node
|
285
|
-
new_node.next = node.next
|
286
|
-
if node.next
|
287
|
-
node.next.prev = new_node
|
288
|
-
else
|
289
|
-
@tail = new_node
|
290
|
-
end
|
291
|
-
node.next = new_node
|
292
|
-
@length += 1
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
|
297
|
-
# Inserts data before passed node.
|
298
|
-
#
|
299
|
-
# == Returns:
|
300
|
-
# Inserted node
|
301
|
-
#
|
302
|
-
def insert_before_node(data, node)
|
303
|
-
Node(data).tap do |new_node|
|
304
|
-
new_node.next = node
|
305
|
-
new_node.prev = node.prev
|
306
|
-
if node.prev
|
307
|
-
node.prev.next = new_node
|
308
|
-
else
|
309
|
-
@head = new_node
|
310
|
-
end
|
311
|
-
node.prev = new_node
|
312
|
-
@length += 1
|
313
|
-
end
|
314
|
-
end
|
315
|
-
|
316
286
|
private
|
317
287
|
|
318
288
|
def __unlink_node(node)
|
289
|
+
@head = node.next if node.prev.nil?
|
290
|
+
@tail = node.prev if node.next.nil?
|
291
|
+
|
319
292
|
if node.prev.nil?
|
320
293
|
node.next.prev = nil if node.next
|
321
|
-
@head = node.next
|
322
294
|
elsif node.next.nil?
|
323
295
|
node.prev.next = nil if node.prev
|
324
|
-
@tail = node.prev
|
325
296
|
else
|
326
297
|
node.prev.next, node.next.prev = node.next, node.prev
|
327
298
|
end
|
328
299
|
@length -= 1
|
329
300
|
end
|
330
301
|
|
331
|
-
|
332
302
|
def __to_matcher(val = nil, &block)
|
333
303
|
raise ArgumentError, 'either value or block should be passed' if val && block_given?
|
334
304
|
block = ->(e) { e == val } unless block_given?
|
@@ -338,7 +308,7 @@ module LinkedList
|
|
338
308
|
def __shift
|
339
309
|
head = @head
|
340
310
|
@head = @head.next
|
341
|
-
head.
|
311
|
+
@head.prev = nil if @head
|
342
312
|
head
|
343
313
|
end
|
344
314
|
|
data/lib/linked-list/version.rb
CHANGED
data/linked-list.gemspec
CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency 'bundler', '>=
|
21
|
+
spec.add_development_dependency 'bundler', '>= 2.0', '< 3.0'
|
22
22
|
spec.add_development_dependency 'coveralls', '~> 0'
|
23
23
|
spec.add_development_dependency 'm', '~> 1.5', '>= 1.5.0'
|
24
24
|
spec.add_development_dependency 'minitest', '>= 5.0', '<= 6.0'
|
25
|
-
spec.add_development_dependency 'rake', '
|
25
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
26
26
|
end
|
data/test/list_test.rb
CHANGED
@@ -4,6 +4,7 @@ describe LinkedList::List do
|
|
4
4
|
let(:list) { create_list }
|
5
5
|
let(:node_1) { create_node('foo') }
|
6
6
|
let(:node_2) { create_node('bar') }
|
7
|
+
let(:node_3) { create_node('baz') }
|
7
8
|
|
8
9
|
describe 'instantiation' do
|
9
10
|
it 'assigns first to nil' do
|
@@ -476,6 +477,75 @@ describe LinkedList::List do
|
|
476
477
|
end
|
477
478
|
end
|
478
479
|
end
|
480
|
+
|
481
|
+
describe 'by node' do
|
482
|
+
it 'deletes first node' do
|
483
|
+
list.push(node_1)
|
484
|
+
list.push(node_2)
|
485
|
+
list.push(node_3)
|
486
|
+
list.delete(node_1)
|
487
|
+
assert_equal ['bar', 'baz'], list.to_a
|
488
|
+
end
|
489
|
+
|
490
|
+
it 'returns deleted value' do
|
491
|
+
list.push(node_1)
|
492
|
+
list.delete(node_1)
|
493
|
+
assert_equal node_1.data, list.delete(node_1)
|
494
|
+
end
|
495
|
+
|
496
|
+
it 'decreases length of list' do
|
497
|
+
list.push('foo')
|
498
|
+
list.push('bar')
|
499
|
+
list.push('baz')
|
500
|
+
list.delete('foo')
|
501
|
+
assert_equal 2, list.length
|
502
|
+
end
|
503
|
+
|
504
|
+
describe 'position edge cases' do
|
505
|
+
before do
|
506
|
+
list.push(node_1)
|
507
|
+
list.push(node_2)
|
508
|
+
list.push(node_3)
|
509
|
+
end
|
510
|
+
|
511
|
+
it 'deletes value from head' do
|
512
|
+
list.delete(node_1)
|
513
|
+
assert_equal [node_2.data, node_3.data], list.to_a
|
514
|
+
assert_equal node_2.data, list.first
|
515
|
+
assert_equal node_3.data, list.last
|
516
|
+
end
|
517
|
+
|
518
|
+
it 'deletes value from middle' do
|
519
|
+
list.delete(node_2)
|
520
|
+
assert_equal [node_1.data, node_3.data], list.to_a
|
521
|
+
assert_equal node_1.data, list.first
|
522
|
+
assert_equal node_3.data, list.last
|
523
|
+
end
|
524
|
+
|
525
|
+
|
526
|
+
it 'deletes value from tail' do
|
527
|
+
list.delete(node_3)
|
528
|
+
assert_equal [node_1.data, node_2.data], list.to_a
|
529
|
+
assert_equal node_1.data, list.first
|
530
|
+
assert_equal node_2.data, list.last
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
describe 'delete edge cases' do
|
535
|
+
it 'resets original list state when deleting the last node of the list' do
|
536
|
+
assert_nil list.first
|
537
|
+
assert_nil list.last
|
538
|
+
|
539
|
+
list.push(node_1)
|
540
|
+
assert_equal node_1.data, list.first
|
541
|
+
assert_equal node_1.data, list.last
|
542
|
+
|
543
|
+
list.delete(node_1)
|
544
|
+
assert_nil list.first
|
545
|
+
assert_nil list.last
|
546
|
+
end
|
547
|
+
end
|
548
|
+
end
|
479
549
|
end
|
480
550
|
|
481
551
|
describe '#delete_all' do
|
@@ -568,6 +638,16 @@ describe LinkedList::List do
|
|
568
638
|
assert_nil list.first
|
569
639
|
end
|
570
640
|
|
641
|
+
it 'sets reference to the prev node' do
|
642
|
+
list.push(node_1)
|
643
|
+
list.push(node_2)
|
644
|
+
assert_nil node_1.prev
|
645
|
+
assert_equal node_2.prev, node_1
|
646
|
+
|
647
|
+
list.shift
|
648
|
+
assert_nil node_2.prev
|
649
|
+
end
|
650
|
+
|
571
651
|
it 'reduces list length by 1' do
|
572
652
|
list.push(node_1)
|
573
653
|
list.shift
|
metadata
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linked-list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yury Velikanau
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.3'
|
20
|
-
- - "<="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '2.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.3'
|
30
|
-
- - "<="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '2.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: coveralls
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,16 +88,16 @@ dependencies:
|
|
88
88
|
name: rake
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- - "
|
91
|
+
- - ">="
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
93
|
+
version: 12.3.3
|
94
94
|
type: :development
|
95
95
|
prerelease: false
|
96
96
|
version_requirements: !ruby/object:Gem::Requirement
|
97
97
|
requirements:
|
98
|
-
- - "
|
98
|
+
- - ">="
|
99
99
|
- !ruby/object:Gem::Version
|
100
|
-
version:
|
100
|
+
version: 12.3.3
|
101
101
|
description: Ruby implementation of Doubly Linked List, following some Ruby idioms.
|
102
102
|
email:
|
103
103
|
- yury.velikanau@gmail.com
|
@@ -130,7 +130,7 @@ homepage: https://github.com/spectator/linked-list
|
|
130
130
|
licenses:
|
131
131
|
- MIT
|
132
132
|
metadata: {}
|
133
|
-
post_install_message:
|
133
|
+
post_install_message:
|
134
134
|
rdoc_options: []
|
135
135
|
require_paths:
|
136
136
|
- lib
|
@@ -145,9 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: '0'
|
147
147
|
requirements: []
|
148
|
-
|
149
|
-
|
150
|
-
signing_key:
|
148
|
+
rubygems_version: 3.1.2
|
149
|
+
signing_key:
|
151
150
|
specification_version: 4
|
152
151
|
summary: Ruby implementation of Doubly Linked List, following some Ruby idioms.
|
153
152
|
test_files:
|