Class: Einutricional::DoubleLinkedList
- Inherits:
-
Object
- Object
- Einutricional::DoubleLinkedList
- Includes:
- Enumerable
- Defined in:
- lib/einutricional/double_linked_list.rb
Overview
Lista doblemente enlazada. Contenedor para cualquier tipo de objeto
Defined Under Namespace
Classes: Node
Instance Attribute Summary collapse
-
#count ⇒ Object
readonly
Returns the value of attribute count.
-
#head ⇒ Object
readonly
Returns the value of attribute head.
-
#tail ⇒ Object
readonly
Returns the value of attribute tail.
Instance Method Summary collapse
-
#[](pos) ⇒ Object
Operador de consulta al elemento.
- #[]=(pos, value) ⇒ Object
-
#each ⇒ Object
Permite recorrer todos los elementos a su vez que admite bloques para modificarlos.
-
#empty? ⇒ true, false
Dice si la lista está vacía.
-
#initialize ⇒ DoubleLinkedList
constructor
Inicializa la lista.
-
#pop_front ⇒ Object
Elimina un elemento por el frente de la lista.
-
#push_back(value) ⇒ Object
Añade un elemento a la lista por la cola.
- #size ⇒ Object
- #sort_each ⇒ Object
- #sort_for ⇒ Object
- #sorted? ⇒ Boolean
Constructor Details
#initialize ⇒ DoubleLinkedList
Inicializa la lista. No recibe parámetros
11 12 13 14 15 |
# File 'lib/einutricional/double_linked_list.rb', line 11 def initialize @head = nil @tail = nil @count = 0 end |
Instance Attribute Details
#count ⇒ Object (readonly)
Returns the value of attribute count.
5 6 7 |
# File 'lib/einutricional/double_linked_list.rb', line 5 def count @count end |
#head ⇒ Object (readonly)
Returns the value of attribute head.
5 6 7 |
# File 'lib/einutricional/double_linked_list.rb', line 5 def head @head end |
#tail ⇒ Object (readonly)
Returns the value of attribute tail.
5 6 7 |
# File 'lib/einutricional/double_linked_list.rb', line 5 def tail @tail end |
Instance Method Details
#[](pos) ⇒ Object
Operador de consulta al elemento
41 42 43 44 45 46 47 48 49 50 51 |
# 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) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 |
# 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 ⇒ Object
Permite recorrer todos los elementos a su vez que admite bloques para modificarlos
67 68 69 70 71 72 73 |
# File 'lib/einutricional/double_linked_list.rb', line 67 def each i = 0 while i < @count yield self[i] i += 1 end end |
#empty? ⇒ true, false
Dice si la lista está vacía
102 103 104 |
# File 'lib/einutricional/double_linked_list.rb', line 102 def empty? @count.zero? end |
#pop_front ⇒ Object
Elimina un elemento por el frente de la lista
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# 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) ⇒ Object
Añade un elemento a la lista por la cola.
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# 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 ⇒ Object
75 76 77 |
# File 'lib/einutricional/double_linked_list.rb', line 75 def size @count end |
#sort_each ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# 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 ⇒ Object
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# 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? ⇒ Boolean
106 107 108 |
# File 'lib/einutricional/double_linked_list.rb', line 106 def sorted? each_cons(2).all? { |left, right| left <= right } end |