collection_framework 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 78a195f3fbdbe78667594623e23b1438855da142b1297b31d6087cd79d6ba660
4
+ data.tar.gz: ed8fbe9c78513355e881ce554cf074db2faa03a5f07b4b1a1e7e9f3ecb3339e9
5
+ SHA512:
6
+ metadata.gz: 5c70854b7dfd19c2ddf354b222d1cb95f98f8b28917da2fd75e4a484c387f66af65a9a479adf72769d0a68a596a997362cd54f9fee68fe7c0dba73ca65cc8e98
7
+ data.tar.gz: 70e934a3d27f7f51ca9b31a5cb007cd8ecf72575787d46b311ab06a3e9062f3e191418d99f4cdc03f2097e29133fbccf7aa73f956d36b229de0675a415f195a4
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CollectionFramework
4
+ class Error < StandardError; end
5
+ end
6
+
7
+ require 'collection_framework/doubly_linked_list/list'
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'node'
4
+
5
+ class DoublyLinkedList
6
+ attr_accessor :head, :last, :length
7
+
8
+ def initialize
9
+ @head = nil
10
+ @last = nil
11
+ @length = 0
12
+ end
13
+
14
+ # @param [Integer] (index) Value of the current Node.
15
+ # @return [Integer] (Return) the value of the node.
16
+ def get(index)
17
+ return -1 if index >= @length
18
+
19
+ current_index = 0
20
+ pointer = @head
21
+ while current_index != index
22
+ pointer = pointer.next
23
+ current_index += 1
24
+ end
25
+ pointer&.val
26
+ end
27
+
28
+ # @param [Object] val
29
+ # @return [nil]
30
+ def add_at_head(val)
31
+ new_node = DoublyLinkedListNode.new(val, @head, nil)
32
+ if @length.zero?
33
+ @head = new_node
34
+ @last = new_node
35
+ else
36
+ @head.prev = new_node
37
+ @head = new_node
38
+ end
39
+ @length += 1
40
+ nil
41
+ end
42
+
43
+ # @param [Object] val
44
+ # @return [nil]
45
+ def add_at_tail(val)
46
+ new_node = DoublyLinkedListNode.new(val, nil, @last)
47
+ if @length.zero?
48
+ @head = new_node
49
+ else
50
+ @last.next = new_node
51
+ end
52
+ @last = new_node
53
+ @length += 1
54
+ nil
55
+ end
56
+
57
+ # @param [Integer] index where value need to be inserted
58
+ # @param [Object] val which needs to be inserted
59
+ # @return [nil] nil
60
+ def add_at_index(index, val)
61
+ return if index > length
62
+
63
+ case index
64
+ when length
65
+ add_at_tail(val)
66
+ when 0
67
+ add_at_head(val)
68
+ else
69
+ current_index = 0
70
+ current_pointer = @head
71
+ prev_pointer = nil
72
+ while current_index != index
73
+ current_pointer = current_pointer.next
74
+ prev_pointer = current_pointer.prev
75
+ current_index += 1
76
+ end
77
+ new_node = DoublyLinkedListNode.new(val, current_pointer, prev_pointer)
78
+ current_pointer.prev = new_node
79
+ prev_pointer.next = new_node
80
+ @length += 1
81
+ end
82
+ end
83
+
84
+ # @param [Integer] index where value need to be inserted
85
+ # @return [nil] nil
86
+ def delete_at_index(index)
87
+ return if index >= @length
88
+
89
+ case index
90
+ when 0
91
+ @head = @head.next
92
+ @head&.prev = nil
93
+ when @length - 1
94
+ @last = @last.prev
95
+ @last.next = nil
96
+ else
97
+ current_index = 0
98
+ current_pointer = @head
99
+ prev_pointer = nil
100
+ while current_index != index
101
+ current_pointer = current_pointer.next
102
+ prev_pointer = current_pointer.prev
103
+ current_index += 1
104
+ end
105
+ prev_pointer.next = current_pointer.next
106
+ current_pointer.next.prev = prev_pointer
107
+ end
108
+ @length -= 1
109
+ end
110
+
111
+ # @return [String] Return the various values Concatenated with '->'
112
+ def to_s
113
+ current_pointer = @head
114
+ str = ''
115
+ until current_pointer.nil?
116
+ str += current_pointer.val.to_s
117
+ current_pointer = current_pointer.next
118
+ str += '->' unless current_pointer.nil?
119
+ end
120
+ str
121
+ end
122
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DoublyLinkedListNode
4
+ attr_accessor :val, :next, :prev
5
+
6
+ def initialize(val, _next, _prev)
7
+ @val = val
8
+ @next = _next
9
+ @prev = _prev
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: collection_framework
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Sarthak Birla
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-11-01 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: The Collection Framework for Ruby to implement the complex Data Structures
14
+ easily
15
+ email: sarthak23birla@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/collection_framework.rb
21
+ - lib/collection_framework/doubly_linked_list/list.rb
22
+ - lib/collection_framework/doubly_linked_list/node.rb
23
+ homepage: https://github.com/sarthak23birla/ruby-collection-framework
24
+ licenses:
25
+ - MIT
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubygems_version: 3.1.2
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: The collection Framework
46
+ test_files: []