/* * Borra un elemento de la lista, dada la posición del mismo. Se consideran * tres casos: * (A) El Elemento es la Cabeza * (B) El Elemento es el Último * (C) El Elemento está en Medio * Es importante recalcar que para borrar un elemento es necesario primero * desenlazarlo de la lista y luego liberar su memoria, pues en caso contrario * liberaríamos todos los elementos siguiente a este elemento. */ Object* LinkedList::remove(int pos) { // Si es una posición Inválida if (pos < 0 || pos >= getSize) return NULL; // Indicar fracaso en la operación DLLNode* tmp; Object* tmpData; if (pos == 0){ // Desea Borrar la Cabeza // Desenlazar tmpData = head->getData(); tmp = head->getNext(); head->setData(NULL); tmp->setPrev(NULL); head->setNext(NULL); // Liberar Memoria delete head; // Actualizar head head = tmp; }else if (pos == getSize - 1){ // Desea Borrar el último // Recorrer hasta el final tmp = head; for (int i=1; i<pos; i++) tmp = tmp->getNext(); tmpData = tmp->getNext()->getData(); // Desenlazar DLLNode* toErase = tmp->getNext(); tmp->setNext(NULL); toErase->setPrev(NULL); toErase->setData(NULL); // Liberar Memoria delete toErase; }else { // Desea Borrar de enmedio // Recorrer hasta el nodo anterior al que se desea borrar tmp = head; for (int i=1; i<pos; i++) tmp = tmp->getNext(); // Desenlazar tmpData = tmp->getNext()->getData(); DLLNode* toErase = tmp->getNext(); tmp->setNext(toErase->getNext()); toErase->getNext()->setPrev(tmp); toErase->setNext(NULL); toErase->setPrev(NULL); toErase->setData(NULL); // Liberar Memoria delete toErase; } getSize--; // Disminuir Tamaño return tmpData; // Indicar Éxito }
/* * Inserción en la lista * En esta operación se consideran cuatro casos generales de inserción: * (A) La Lista está Vacía * (B) Se desea Insertar antes de head (pos = 0) * (C) Se desea Insertar en Medio de la Lista * (D) Se desea Insertar al Final (pos = getSize) */ bool LinkedList::insert(Object* data, int pos) { // Si se desa meter en una posición inválida if (pos < 0 || pos > getSize) return false; // Fracaso en esta Operación // Creación del Nodo que insertaremos en la lista DLLNode* neo = new DLLNode(data); if (!head) // La lista está vacía head = neo; else { // La Lista tiene elementos if (pos == 0){ // Desea insertar al principio de la lista // Enlace de neo a la lista head->setPrev(neo); neo->setNext(head); // Actualizar la cabeza head = neo; }else if (pos > 0 && pos < getSize){ // Desea Insertar en medio DLLNode* tmp = head; // Recorrer hasta la posición anterior a la que deseamos insertar for (int i=1; i<pos; i++) tmp = tmp->getNext(); // Enlazar el Nodo neo neo->setPrev(tmp); neo->setNext(tmp->getNext()); tmp->getNext()->setPrev(neo); tmp->setNext(neo); }else { // Desea insertar al final DLLNode* tmp = head; // Recorrer la Lista hasta el final for (int i=1; i<pos; i++) tmp = tmp->getNext(); // Enlazar el Nodo neo tmp->setNext(neo); neo->setPrev(tmp); } } // Incremento del tamaño getSize++; // Éxito en la operación return true; }