diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..8bf4d45
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,6 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks
new file mode 100644
index 0000000..e409da2
--- /dev/null
+++ b/.idea/.rakeTasks
@@ -0,0 +1,7 @@
+
+
diff --git a/.idea/linked-lists.iml b/.idea/linked-lists.iml
new file mode 100644
index 0000000..a1a27da
--- /dev/null
+++ b/.idea/linked-lists.iml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..510e7fc
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..fae548e
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.rakeTasks b/.rakeTasks
new file mode 100644
index 0000000..e409da2
--- /dev/null
+++ b/.rakeTasks
@@ -0,0 +1,7 @@
+
+
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..630ea95
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,36 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ ansi (1.5.0)
+ builder (3.2.4)
+ coderay (1.1.3)
+ method_source (1.0.0)
+ minitest (5.14.2)
+ minitest-reporters (1.4.2)
+ ansi
+ builder
+ minitest (>= 5.0)
+ ruby-progressbar
+ minitest-skip (0.0.3)
+ minitest (~> 5.0)
+ minitest-spec (0.0.2.1)
+ minitest (>= 3.0)
+ pry (0.13.1)
+ coderay (~> 1.1)
+ method_source (~> 1.0)
+ rake (13.0.1)
+ ruby-progressbar (1.10.1)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ minitest
+ minitest-reporters
+ minitest-skip
+ minitest-spec
+ pry
+ rake
+
+BUNDLED WITH
+ 2.1.4
diff --git a/lib/linked_list.rb b/lib/linked_list.rb
index 9e97557..7f82bbf 100644
--- a/lib/linked_list.rb
+++ b/lib/linked_list.rb
@@ -1,4 +1,6 @@
require_relative 'node'
+# helpful resource I used to work on this:
+# https://hackernoon.com/implementing-singly-linked-list-with-ruby-om2df3ya6
class LinkedList
attr_reader :head
@@ -7,39 +9,64 @@ def initialize
@head = nil
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(1) - A node is added to the beginning of the list. Since this is not an array, we are not replacing an element and shifting the rest of the data over.
+ # Space complexity - O(1)
def add_first(data)
-
+ new_node = Node.new(data)
+ new_node.next = @head
+ @head = new_node
+ return @head
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(1) - We look up the first node (where the head is)
+ # Space complexity - O(1)
def get_first
-
+ return @head.data unless @head.nil?
+ return nil
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(n) we count n nodes in the list
+ # Space complexity - O(1)
def length
- return 0
+ count = 0
+ current = @head
+ until current.nil?
+ count += 1
+ current = current.next
+ end
+
+ return count
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(n) - need to traverse list of length n to find the last node and add one after that
+ # Space complexity - O(1)
def add_last(data)
+ return add_first(data) if @head.nil?
+ current = @head
+ current = current.next until current.next.nil?
+
+ current.next = Node.new(data)
+ return current.next
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(n) - we need to traverse the list of length n to find the last node
+ # Space complexity - O(1)
def get_last
-
+ return nil if @head.nil?
+ current = @head
+ current = current.next until current.next.nil?
+ return current.data
end
- # Time complexity - ?
- # Space complexity - ?
+ # Time complexity - O(n) - worst case scenario, we need to iterate through n times to find the node (not a direct look up)
+ # Space complexity - O(1)
def get_at_index(index)
-
+ return nil if @head.nil?
+ current = @head
+ index.times do
+ current = current.next
+ end
+ return current.data
end
end
diff --git a/lib/node.rb b/lib/node.rb
index 469eca3..65a8e8c 100644
--- a/lib/node.rb
+++ b/lib/node.rb
@@ -3,8 +3,8 @@ class Node
attr_reader :data
attr_accessor :next
- def initialize(value, nextNode = nil)
+ def initialize(value, next_node = nil)
@data = value
- @next = nextNode
+ @next = next_node
end
end
diff --git a/test/linked_list_test.rb b/test/linked_list_test.rb
index bdbbd06..8e558e7 100644
--- a/test/linked_list_test.rb
+++ b/test/linked_list_test.rb
@@ -21,7 +21,7 @@
end
end
- xdescribe 'add_first & get_first' do
+ describe 'add_first & get_first' do
it 'can add values to an empty list' do
# Act
@list.add_first(3)
@@ -51,7 +51,7 @@
end
end
- xdescribe "length" do
+ describe "length" do
it "will return 0 for an empty list" do
expect(@list.length).must_equal 0
end
@@ -66,7 +66,7 @@
end
end
- xdescribe "addLast & getLast" do
+ describe "addLast & getLast" do
it "will add to the front if the list is empty" do
@list.add_last(1)
expect(@list.get_first).must_equal 1
@@ -93,7 +93,7 @@
end
end
- xdescribe 'get_at_index' do
+ describe 'get_at_index' do
it 'returns nil if the index is outside the bounds of the list' do
expect(@list.get_at_index(3)).must_be_nil
end