From cfe01a59e5b2fbb4109cbf57cf41b8cf93595416 Mon Sep 17 00:00:00 2001 From: marks214 Date: Fri, 11 Dec 2020 16:39:38 -0800 Subject: [PATCH 1/3] linked_list.rb is now working --- .idea/.gitignore | 6 ++++++ .idea/linked-lists.iml | 27 +++++++++++++++++++++++++++ .idea/misc.xml | 4 ++++ .idea/modules.xml | 8 ++++++++ .idea/vcs.xml | 6 ++++++ .rakeTasks | 7 +++++++ Gemfile.lock | 36 ++++++++++++++++++++++++++++++++++++ lib/linked_list.rb | 34 ++++++++++++++++++++++++++++++---- lib/node.rb | 4 ++-- test/linked_list_test.rb | 8 ++++---- 10 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/linked-lists.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .rakeTasks create mode 100644 Gemfile.lock 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/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..bd6a9ef 100644 --- a/lib/linked_list.rb +++ b/lib/linked_list.rb @@ -10,36 +10,62 @@ def initialize # Time complexity - ? # Space complexity - ? def add_first(data) - + new_node = Node.new(data) + new_node.next = @head + @head = new_node + return @head end # Time complexity - ? # Space complexity - ? def get_first + return @head.data unless @head.nil? + return nil end # Time complexity - ? # Space complexity - ? def length - return 0 + count = 0 + current = @head + until current.nil? + count += 1 + current = current.next + end + + return count end # Time complexity - ? # Space complexity - ? 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 - ? 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 - ? 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 From 5d8c5fac3acb53c69a0317945ed95a61459b9a73 Mon Sep 17 00:00:00 2001 From: marks214 Date: Sat, 12 Dec 2020 17:09:19 -0800 Subject: [PATCH 2/3] added space and time complexities --- .idea/.rakeTasks | 7 +++++++ lib/linked_list.rb | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 .idea/.rakeTasks 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/lib/linked_list.rb b/lib/linked_list.rb index bd6a9ef..35aac81 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,8 +9,8 @@ def initialize @head = nil end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(1) + # Space complexity - O(1) def add_first(data) new_node = Node.new(data) new_node.next = @head @@ -16,16 +18,15 @@ def add_first(data) return @head end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(1) + # Space complexity - O(1) def get_first return @head.data unless @head.nil? - return nil end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(n) + # Space complexity - O(1) def length count = 0 current = @head @@ -37,8 +38,8 @@ def length return count end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(n) - last element is unknown + # Space complexity - O(1) def add_last(data) return add_first(data) if @head.nil? @@ -49,8 +50,8 @@ def add_last(data) return current.next end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(n) + # Space complexity - O(1) def get_last return nil if @head.nil? current = @head @@ -58,8 +59,8 @@ def get_last return current.data end - # Time complexity - ? - # Space complexity - ? + # Time complexity - O(n) + # Space complexity - O(1) def get_at_index(index) return nil if @head.nil? current = @head From 4dd1873ce87054db2aa70fd87cf9a08b5dd52efd Mon Sep 17 00:00:00 2001 From: marks214 Date: Mon, 14 Dec 2020 13:07:17 -0800 Subject: [PATCH 3/3] explained time complexities --- lib/linked_list.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/linked_list.rb b/lib/linked_list.rb index 35aac81..7f82bbf 100644 --- a/lib/linked_list.rb +++ b/lib/linked_list.rb @@ -9,7 +9,7 @@ def initialize @head = nil end - # Time complexity - O(1) + # 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) @@ -18,14 +18,14 @@ def add_first(data) return @head end - # Time complexity - O(1) + # 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 - O(n) + # Time complexity - O(n) we count n nodes in the list # Space complexity - O(1) def length count = 0 @@ -38,7 +38,7 @@ def length return count end - # Time complexity - O(n) - last element is unknown + # 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? @@ -50,7 +50,7 @@ def add_last(data) return current.next end - # Time complexity - O(n) + # 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? @@ -59,7 +59,7 @@ def get_last return current.data end - # Time complexity - O(n) + # 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?