# El struct Node, es un nodo que contiene un valor y tiene dos atributos next y prev que apuntan al nodo siguiente y al previo Node = Struct.new(:value, :next, :prev) # Define una clase de lista doblemente enlazada class List include Enumerable attr_accessor :head, :tail # Constructor de la clase, crea una lista vacía def initialize # Atributo que es igual al primer elemento de la lista @head = nil # Atributo que es igual al último elemento de la lista @tail = nil end # Devuleve true si la lista está vacía y false si contiene al menos un elemento def empty if @head == nil true else false end end # Elimina el primer elemento de la lista y lo devuelve def extract_first if empty() nil else nodeAux = @head @head = @head.next nodeAux.value end end # Elimina el último elemento de la lista y lo devuelve def extract_last if empty() nil else nodeAux = @tail @tail = @tail.prev nodeAux.value end end # Inserta un nuevo nodo, que se crea a partir del valor pasado por parámetro, por el principio def insert_first(value) newNode = Node.new(value, nil, nil) if empty() @head = newNode @tail = newNode else aux = @head @head = newNode @head.next = aux if aux == @tail @tail.prev = @head else aux.prev = @head end end end # Inserta un nuevo nodo, que se crea a partir del valor pasado por parámetro, por el final def insert_last(value) newNode = Node.new(value, nil, nil) if empty() @head = newNode @tail = newNode else aux = @tail @tail = newNode @tail.prev = aux if @head == aux @head.next = @tail else aux.next = @tail end end end # Usando la función insert_first permite pasar un vector de valores e insertarlos def insert_multi_first(values) for i in 0..values.length-1 insert_first(values[i]) end end # Usando la función insert_last permite pasar un vector de valores e insertarlos def insert_multi_last(values) for i in 0..values.length-1 insert_last(values[i]) end end # Recorre los elementos del vector para poder usar los funciones Enumerable def each aux = @head while aux != nil yield aux.value aux = aux.next end end end