class Einutricional::DoubleLinkedList
Lista doblemente enlazada. Contenedor para cualquier tipo de objeto
Constants
- Node
Nodo para almacenar un objeto y referencias a los nodos contiguos
Attributes
count[R]
head[R]
tail[R]
Public Class Methods
new()
click to toggle source
Inicializa la lista. No recibe parámetros
# File lib/einutricional/double_linked_list.rb, line 11 def initialize @head = nil @tail = nil @count = 0 end
Public Instance Methods
[](pos)
click to toggle source
Operador de consulta al elemento @param pos es la posición del elemento que se quiere consultar @return el elemento buscado
# File lib/einutricional/double_linked_list.rb, line 41 def [](pos) raise 'ERROR: index out of limits' unless pos >= 0 && pos < @count node = @head i = 0 while i < pos node = node.next i += 1 end node.value end
[]=(pos, value)
click to toggle source
# File lib/einutricional/double_linked_list.rb, line 53 def []=(pos, value) raise 'ERROR: index out of limits' unless pos >= 0 && pos < @count node = @head i = 0 while i < pos node = node.next i += 1 end node.value = value end
each() { |self| ... }
click to toggle source
Permite recorrer todos los elementos a su vez que admite bloques para modificarlos @return void
# File lib/einutricional/double_linked_list.rb, line 67 def each i = 0 while i < @count yield self[i] i += 1 end end
empty?()
click to toggle source
Dice si la lista está vacía @return [true,false] según haya o no elementos
# File lib/einutricional/double_linked_list.rb, line 102 def empty? @count.zero? end
pop_front()
click to toggle source
Elimina un elemento por el frente de la lista @return el elemento eliminado
# File lib/einutricional/double_linked_list.rb, line 81 def pop_front unless empty? if @count == 1 value = @head.value @head = nil @tail = nil ret = value else aux = @head.next aux.prev = nil value = @head.value @head = aux ret = value end @count -= 1 ret end end
push_back(value)
click to toggle source
Añade un elemento a la lista por la cola. @param value es el valor que se añade y puede ser cualquier objeto @return la cantidad de elementos que hay en la lista
# File lib/einutricional/double_linked_list.rb, line 20 def push_back(value) node = Node.new(value) if @head.nil? # lista vacía node.prev = nil node.next = nil @head = node @tail = node else # hay al menos un elemento en la lista node.prev = @tail @tail.next = node @tail = node node.next = nil end @count += 1 end
size()
click to toggle source
# File lib/einutricional/double_linked_list.rb, line 75 def size @count end
sort_each()
click to toggle source
# File lib/einutricional/double_linked_list.rb, line 128 def sort_each temp = 0 list = self list.each do k = 0 j = 1 while j < list.size if list[k] > list[j] temp = list[k] list[k] = list[j] list[j] = temp end k += 1 j += 1 end end list end
sort_for()
click to toggle source
# File lib/einutricional/double_linked_list.rb, line 110 def sort_for list = self return list if list.size <= 1 # already sorted swapped = true while swapped do swapped = false for i in 0..(list.size - 2) if list[i] > list[i + 1] list[i], list[i + 1] = list[i + 1], list[i] # swap values swapped = true end end end list end
sorted?()
click to toggle source
# File lib/einutricional/double_linked_list.rb, line 106 def sorted? each_cons(2).all? { |left, right| left <= right } end