Class: NutritionalCalculator::LinkedList

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/nutritional_calculator/linkedlist.rb

Overview

Clase que representa a una lista doblemente enlazada.

Defined Under Namespace

Classes: Node

Instance Method Summary collapse

Constructor Details

#initializeLinkedList

Constructor que inicializa una lista vacía.



15
16
17
18
19
20
21
22
23
24
# File 'lib/nutritional_calculator/linkedlist.rb', line 15

def initialize

  # Atribute that represents the head
  # of the list.
  @head = nil

  # Atribute that represents the tail
  # of the list.
  @tail = nil
end

Instance Method Details

#[](pos) ⇒ value?

Método que accede a un elemento dada su posición en la lista.

Parameters:

  • pos (number)

    Posición del elemento en la lista.

Returns:

  • (value, nil)

    Elemento que se encuentra en la posición pos.



147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/nutritional_calculator/linkedlist.rb', line 147

def [] (pos)

  current_node = @head
  i = 0
  while current_node and i != pos
    current_node = current_node.next
    i += 1
  end
  if current_node
    current_node.value
  else
    nil
  end
end

#backvalue?

Método que accede al último elemento de la lista.

Returns:

  • (value, nil)

    Último elemento de la lista.



135
136
137
138
139
140
141
# File 'lib/nutritional_calculator/linkedlist.rb', line 135

def back
  if @tail
    @tail.value
  else
    nil
  end
end

#eachObject

Método que pasa a cada elemento de la lista un bloque para que se ejecute.



164
165
166
167
168
169
170
# File 'lib/nutritional_calculator/linkedlist.rb', line 164

def each
  current_node = @head
  while current_node
    yield current_node.value
    current_node = current_node.next
  end
end

#erase(value) ⇒ Object

Método que busca la primera ocurrencia de un elemento en la lista y lo elimina.

Parameters:

  • value (value)
    value

    Valor que pretendemos eliminar.



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/nutritional_calculator/linkedlist.rb', line 97

def erase(value)

  if @head and @head.value == value
    pop_front
  elsif @tail and @tail.value == value
    pop_back
  else

    current_node = @head
    while current_node

      if current_node.value == value
        current_node.prev.next = current_node.next
        current_node.next.prev = current_node.prev
      end

      current_node = current_node.next
    end

  end
end

#frontvalue?

Método que accede al valor del primer elemento de la lista.

Returns:

  • (value, nil)

    Primer elemento de la lista.



124
125
126
127
128
129
130
# File 'lib/nutritional_calculator/linkedlist.rb', line 124

def front
  if @head
    @head.value
  else
    nil
  end
end

#insert(*values) ⇒ Object

Método que inserta un conjunto de valores por la parte posterior de la lista.

Parameters:

  • values (value)

    conjunto de elementos que queremos insertar en la lista.



59
60
61
62
63
# File 'lib/nutritional_calculator/linkedlist.rb', line 59

def insert(*values)
  values.each do |value|
    push_back(value)
  end
end

#pop_backObject

Método que extrae el último elemento posterior de la lista



69
70
71
72
73
74
75
76
77
78
# File 'lib/nutritional_calculator/linkedlist.rb', line 69

def pop_back
  if @head == @tail
    @head = @tail = nil
  else
    if @tail
      @tail = @tail.prev
      @tail.next = nil;
    end
  end
end

#pop_frontObject

Método que extrae el primer elemento de la lista.



82
83
84
85
86
87
88
89
90
91
# File 'lib/nutritional_calculator/linkedlist.rb', line 82

def pop_front
  if @head == @tail
    @head = @tail = nil
  else
    if @head
      @head = @head.next
      @head.prev = nil;
    end
  end
end

#push_back(value) ⇒ Object

Método que inseta un valor por la parte posterior de la lista.

Parameters:

  • value (value)

    Valor que queremos insertar.



31
32
33
34
35
36
37
38
39
40
# File 'lib/nutritional_calculator/linkedlist.rb', line 31

def push_back(value)
  if @head == nil
    @head = Node.new(value, nil, nil)
    @tail = @head
  else
    current_node = Node.new(value, nil, @tail)
    @tail.next = current_node
    @tail = current_node
  end
end

#push_front(value) ⇒ Object

Método que inseta un valor por la parte delantera de la lista.

Parameters:

  • value (value)

    Valor que queremos insertar.



45
46
47
48
49
50
51
52
53
54
# File 'lib/nutritional_calculator/linkedlist.rb', line 45

def push_front(value)
  if @head == nil
    @head = Node.new(value, nil, nil)
    @tail = @head
  else
    current_node = Node.new(value, @head, nil)
    @head.prev = current_node
    @head = current_node
  end
end

#to_sString

Método que transforma el objeto en un String. De esta forma será formateado por pantalla.

Returns:

  • (String)

    String con el objeto formateado.



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/nutritional_calculator/linkedlist.rb', line 176

def to_s
  list_as_string = ""

  current_node = @head
  while current_node
    list_as_string += "#{current_node.value}"

    if current_node.next
      list_as_string += " <-- "
    end

    current_node = current_node.next
  end

  list_as_string
end