ruby - linked-list
This commit is contained in:
parent
458588cbb6
commit
9cce51670a
58
ruby/linked-list/README.md
Normal file
58
ruby/linked-list/README.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
# Linked List
|
||||||
|
|
||||||
|
Implement a doubly linked list.
|
||||||
|
|
||||||
|
Like an array, a linked list is a simple linear data structure. Several
|
||||||
|
common data types can be implemented using linked lists, like queues,
|
||||||
|
stacks, and associative arrays.
|
||||||
|
|
||||||
|
A linked list is a collection of data elements called *nodes*. In a
|
||||||
|
*singly linked list* each node holds a value and a link to the next node.
|
||||||
|
In a *doubly linked list* each node also holds a link to the previous
|
||||||
|
node.
|
||||||
|
|
||||||
|
You will write an implementation of a doubly linked list. Implement a
|
||||||
|
Node to hold a value and pointers to the next and previous nodes. Then
|
||||||
|
implement a List which holds references to the first and last node and
|
||||||
|
offers an array-like interface for adding and removing items:
|
||||||
|
|
||||||
|
* `push` (*insert value at back*);
|
||||||
|
* `pop` (*remove value at back*);
|
||||||
|
* `shift` (*remove value at front*).
|
||||||
|
* `unshift` (*insert value at front*);
|
||||||
|
|
||||||
|
To keep your implementation simple, the tests will not cover error
|
||||||
|
conditions. Specifically: `pop` or `shift` will never be called on an
|
||||||
|
empty list.
|
||||||
|
|
||||||
|
If you want to know more about linked lists, check [Wikipedia](https://en.wikipedia.org/wiki/Linked_list).
|
||||||
|
|
||||||
|
* * * *
|
||||||
|
|
||||||
|
For installation and learning resources, refer to the
|
||||||
|
[Ruby resources page](http://exercism.io/languages/ruby/resources).
|
||||||
|
|
||||||
|
For running the tests provided, you will need the Minitest gem. Open a
|
||||||
|
terminal window and run the following command to install minitest:
|
||||||
|
|
||||||
|
gem install minitest
|
||||||
|
|
||||||
|
If you would like color output, you can `require 'minitest/pride'` in
|
||||||
|
the test file, or note the alternative instruction, below, for running
|
||||||
|
the test file.
|
||||||
|
|
||||||
|
Run the tests from the exercise directory using the following command:
|
||||||
|
|
||||||
|
ruby linked_list_test.rb
|
||||||
|
|
||||||
|
To include color from the command line:
|
||||||
|
|
||||||
|
ruby -r minitest/pride linked_list_test.rb
|
||||||
|
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
Classic computer science topic
|
||||||
|
|
||||||
|
## Submitting Incomplete Solutions
|
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
48
ruby/linked-list/linked_list.rb
Normal file
48
ruby/linked-list/linked_list.rb
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# Deque class
|
||||||
|
class Deque
|
||||||
|
def initialize
|
||||||
|
@front = nil
|
||||||
|
@back = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def push(data)
|
||||||
|
element = Element.new(data)
|
||||||
|
element.prev = @back
|
||||||
|
@back.next = element if @back
|
||||||
|
@back = element
|
||||||
|
@front = element if @front.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def pop
|
||||||
|
element = @back
|
||||||
|
@back = element.prev
|
||||||
|
@front = nil if @back.nil?
|
||||||
|
element.data
|
||||||
|
end
|
||||||
|
|
||||||
|
def unshift(data)
|
||||||
|
element = Element.new(data)
|
||||||
|
element.next = @front
|
||||||
|
@front.prev = element if @front
|
||||||
|
@front = element
|
||||||
|
@back = element if @back.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def shift
|
||||||
|
element = @front
|
||||||
|
@front = element.next
|
||||||
|
@back = nil if @front.nil?
|
||||||
|
element.data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Element class
|
||||||
|
class Element
|
||||||
|
attr_accessor :data, :next, :prev
|
||||||
|
|
||||||
|
def initialize(data)
|
||||||
|
@data = data
|
||||||
|
@next = nil
|
||||||
|
@prev = nil
|
||||||
|
end
|
||||||
|
end
|
73
ruby/linked-list/linked_list_test.rb
Normal file
73
ruby/linked-list/linked_list_test.rb
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
require 'minitest/autorun'
|
||||||
|
require_relative 'linked_list'
|
||||||
|
|
||||||
|
class DequeTest < Minitest::Test
|
||||||
|
def test_push_pop
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.push(10)
|
||||||
|
deque.push(20)
|
||||||
|
assert_equal 20, deque.pop
|
||||||
|
assert_equal 10, deque.pop
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_push_shift
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.push(10)
|
||||||
|
deque.push(20)
|
||||||
|
assert_equal 10, deque.shift
|
||||||
|
assert_equal 20, deque.shift
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unshift_shift
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.unshift(10)
|
||||||
|
deque.unshift(20)
|
||||||
|
assert_equal 20, deque.shift
|
||||||
|
assert_equal 10, deque.shift
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unshift_pop
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.unshift(10)
|
||||||
|
deque.unshift(20)
|
||||||
|
assert_equal 10, deque.pop
|
||||||
|
assert_equal 20, deque.pop
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_example
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.push(10)
|
||||||
|
deque.push(20)
|
||||||
|
assert_equal 20, deque.pop
|
||||||
|
deque.push(30)
|
||||||
|
assert_equal 10, deque.shift
|
||||||
|
deque.unshift(40)
|
||||||
|
deque.push(50)
|
||||||
|
assert_equal 40, deque.shift
|
||||||
|
assert_equal 50, deque.pop
|
||||||
|
assert_equal 30, deque.shift
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_pop_to_empty
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.push(10)
|
||||||
|
assert_equal 10, deque.pop
|
||||||
|
deque.push(20)
|
||||||
|
assert_equal 20, deque.shift
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_shift_to_empty
|
||||||
|
# skip
|
||||||
|
deque = Deque.new
|
||||||
|
deque.unshift(10)
|
||||||
|
assert_equal 10, deque.shift
|
||||||
|
deque.unshift(20)
|
||||||
|
assert_equal 20, deque.pop
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user