Class: Einutricional::DoubleLinkedList

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Constructor Details

#initializeDoubleLinkedList

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

#countObject (readonly)

Returns the value of attribute count.



5
6
7
# File 'lib/einutricional/double_linked_list.rb', line 5

def count
  @count
end

#headObject (readonly)

Returns the value of attribute head.



5
6
7
# File 'lib/einutricional/double_linked_list.rb', line 5

def head
  @head
end

#tailObject (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

Parameters:

  • pos

    es la posición del elemento que se quiere consultar

Returns:

  • el elemento buscado



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

#eachObject

Permite recorrer todos los elementos a su vez que admite bloques para modificarlos

Returns:

  • void



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

Returns:

  • (true, false)

    según haya o no elementos



102
103
104
# File 'lib/einutricional/double_linked_list.rb', line 102

def empty?
  @count.zero?
end

#pop_frontObject

Elimina un elemento por el frente de la lista

Returns:

  • el elemento eliminado



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.

Parameters:

  • value

    es el valor que se añade y puede ser cualquier objeto

Returns:

  • la cantidad de elementos que hay en la lista



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

#sizeObject



75
76
77
# File 'lib/einutricional/double_linked_list.rb', line 75

def size
  @count
end

#sort_eachObject



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_forObject



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

Returns:

  • (Boolean)


106
107
108
# File 'lib/einutricional/double_linked_list.rb', line 106

def sorted?
  each_cons(2).all? { |left, right| left <= right }
end