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