diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..73f69e09
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks
new file mode 100644
index 00000000..e409da2a
--- /dev/null
+++ b/.idea/.rakeTasks
@@ -0,0 +1,7 @@
+
+
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 00000000..b0db9b0f
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/linked-list.iml b/.idea/linked-list.iml
new file mode 100644
index 00000000..28179284
--- /dev/null
+++ b/.idea/linked-list.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 00000000..15ffe978
--- /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 00000000..a096c061
--- /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 00000000..94a25f7f
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/linked_list.rb b/lib/linked_list.rb
index 0de1ee00..fd01dbbb 100644
--- a/lib/linked_list.rb
+++ b/lib/linked_list.rb
@@ -18,71 +18,163 @@ def initialize
# method to add a new node with the specific data value in the linked list
# insert the new node at the beginning of the linked list
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(1)
+ # Space Complexity: O(1)
def add_first(value)
- raise NotImplementedError
+
+ new_node = Node.new(value, nil)
+ new_node.next = @head
+ @head = new_node
+ return @head.data
end
# method to find if the linked list contains a node with specified value
# returns true if found, false otherwise
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def search(value)
- raise NotImplementedError
+ current = @head
+ while current != nil
+ if current.data == value
+ return true
+ else
+ current = current.next
+ end
+ end
+ return false
end
# method to return the max value in the linked list
# returns the data value and not the node
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def find_max
- raise NotImplementedError
+ return nil if @head.nil?
+ current = @head
+ max_value = @head.data
+ while current != nil
+ if current.data > max_value
+ max_value = current.data
+ end
+ current = current.next
+ end
+ return max_value
end
# method to return the min value in the linked list
# returns the data value and not the node
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def find_min
- raise NotImplementedError
+ return nil if @head.nil?
+ current = @head
+ min_value = current.data
+ while current != nil
+ if current.data < min_value
+ min_value = current.data
+ end
+ current = current.next
+ end
+ return min_value
+
end
# method that returns the length of the singly linked list
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def length
- raise NotImplementedError
+ return 0 if @head.nil?
+ current = @head
+ length = 0
+ while current != nil
+ length += 1
+ current = current.next
+ end
+ return length
end
# method that returns the value at a given index in the linked list
# index count starts at 0
# returns nil if there are fewer nodes in the linked list than the index value
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def get_at_index(index)
- raise NotImplementedError
+ # traverse the list,
+ # index, number of times or
+ # until the end is reach
+ # Then return the current node's value
+ i = 0
+ current = @head
+ while current != nil
+ if i == index
+ return current.data
+ else
+ i += 1
+ current = current.next
+ end
+ end
+
+ return nil
+
end
# method to print all the values in the linked list
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def visit
- raise NotImplementedError
+ current = @head
+ while current !=nil
+ puts current.data
+ current = current.next
+ end
end
# method to delete the first node found with specified value
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def delete(value)
- raise NotImplementedError
+
+ if @head.nil?
+ return
+ end
+
+ if @head.data == value
+ @head = @head.next
+ return
+ end
+
+ current = @head
+ previous = nil
+
+ while current != nil
+ if current.data == value
+ previous.next = current.next
+ end
+ previous = current
+ current = current.next
+ end
end
# method to reverse the singly linked list
# note: the nodes should be moved and not just the values in the nodes
- # Time Complexity: ?
- # Space Complexity: ?
+ # Time Complexity: O(n)
+ # Space Complexity: O(1)
def reverse
- raise NotImplementedError
+ if @head.nil? || @head.next.nil?
+ return @head
+ end
+
+ current = @head
+ previous = nil
+
+ while current != nil
+ temp = current.next
+ current.next = previous
+ previous = current
+ current = temp
+ end
+ @head = previous
end
@@ -118,7 +210,12 @@ def has_cycle
# Time Complexity: ?
# Space Complexity: ?
def get_first
- raise NotImplementedError
+ # return the value of the 1st node in the list
+ if @head.nil?
+ return nil
+ else
+ return @head.data
+ end
end
# method that inserts a given value as a new last node in the linked list
@@ -133,6 +230,9 @@ def add_last(value)
# Time Complexity: ?
# Space Complexity: ?
def get_last
+ # return nil if the list is empty
+ # otherwise traverse the list to the end
+ # Then return the last node's value
raise NotImplementedError
end