109 lines
2.2 KiB
CoffeeScript
109 lines
2.2 KiB
CoffeeScript
# "Classic" linked list implementation that doesn't keep track of its size.
|
|
class LinkedList
|
|
|
|
constructor: ->
|
|
this._head: null # Pointer to the first item in the list.
|
|
|
|
|
|
# Appends some data to the end of the list. This method traverses the existing
|
|
# list and places the value at the end in a new node.
|
|
add: (data) ->
|
|
|
|
# Create a new node object to wrap the data.
|
|
node: {data: data, next: null}
|
|
|
|
current: this._head ||= node
|
|
|
|
if this._head isnt node
|
|
current: current.next while current.next
|
|
current.next: node
|
|
|
|
this
|
|
|
|
|
|
# Retrieves the data at the given position in the list.
|
|
item: (index) ->
|
|
|
|
# Check for out-of-bounds values.
|
|
return null if index < 0
|
|
|
|
current: this._head or null
|
|
i: -1
|
|
|
|
# Advance through the list.
|
|
current: current.next while current and index > (i += 1)
|
|
|
|
# Return null if we've reached the end.
|
|
current and current.data
|
|
|
|
|
|
# Remove the item from the given location in the list.
|
|
remove: (index) ->
|
|
|
|
# Check for out-of-bounds values.
|
|
return null if index < 0
|
|
|
|
current: this._head or null
|
|
i: -1
|
|
|
|
# Special case: removing the first item.
|
|
if index is 0
|
|
this._head: current.next
|
|
else
|
|
|
|
# Find the right location.
|
|
[previous, current]: [current, current.next] while index > (i += 1)
|
|
|
|
# Skip over the item to remove.
|
|
previous.next: current.next
|
|
|
|
# Return the value.
|
|
current and current.data
|
|
|
|
|
|
# Calculate the number of items in the list.
|
|
size: ->
|
|
current: this._head
|
|
count: 0
|
|
|
|
while current
|
|
count += 1
|
|
current: current.next
|
|
|
|
count
|
|
|
|
|
|
# Convert the list into an array.
|
|
toArray: ->
|
|
result: []
|
|
current: this._head
|
|
|
|
while current
|
|
result.push(current.data)
|
|
current: current.next
|
|
|
|
result
|
|
|
|
|
|
# The string representation of the linked list.
|
|
toString: -> this.toArray().toString()
|
|
|
|
|
|
# Tests.
|
|
list: new LinkedList
|
|
|
|
list.add("Hi")
|
|
puts(list.size() is 1)
|
|
puts(list.item(0) is "Hi")
|
|
puts(list.item(1) is null)
|
|
|
|
list: new LinkedList
|
|
list.add("zero").add("one").add("two")
|
|
puts(list.size() is 3)
|
|
puts(list.item(2) is "two")
|
|
puts(list.remove(1) is "one")
|
|
puts(list.item(0) is "zero")
|
|
puts(list.item(1) is "two")
|
|
puts(list.size() is 2)
|
|
puts(list.item(-10) is null)
|