2016-06-26 13:03:04 -04:00
|
|
|
package cl.cromer.estructuras;
|
|
|
|
|
2016-06-26 13:25:51 -04:00
|
|
|
/**
|
|
|
|
* Crear una estructura de dato de tipo lista enlazada circular.
|
2016-06-29 00:33:19 -04:00
|
|
|
*
|
2016-06-26 13:25:51 -04:00
|
|
|
* @author Chris Cromer
|
|
|
|
*/
|
|
|
|
final public class ListaEnlazadaCircular {
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* El primer enlace.
|
|
|
|
*/
|
2016-07-04 11:38:26 -04:00
|
|
|
private ListaEnlace primer;
|
2016-07-03 11:28:26 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* El ultimo enlace.
|
|
|
|
*/
|
2016-07-04 11:38:26 -04:00
|
|
|
private ListaEnlace ultimo;
|
2016-07-03 11:28:26 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* La cantidad de enlaces que hay.
|
|
|
|
*/
|
|
|
|
private int size;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* El tipo de lista enlazada.
|
|
|
|
*/
|
|
|
|
private int tipo;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inicilizar.
|
|
|
|
*/
|
|
|
|
public ListaEnlazadaCircular() {
|
|
|
|
primer = null;
|
|
|
|
ultimo = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Devolver el tipo de lista.
|
|
|
|
*
|
|
|
|
* @return int: El tipo de lista.
|
|
|
|
*/
|
|
|
|
public int getTipo() {
|
|
|
|
return tipo;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cambiar el tipo de lista.
|
|
|
|
*
|
|
|
|
* @param tipo int: El tipo a cambiar.
|
|
|
|
*/
|
|
|
|
public void setTipo(int tipo) {
|
|
|
|
this.tipo = tipo;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Insertar una llave en la lista.
|
|
|
|
*
|
|
|
|
* @param llave int: La llave a insertar.
|
|
|
|
*
|
|
|
|
* @return boolean: Verdad si fue insertado, falso si ya existe la llave.
|
|
|
|
*/
|
|
|
|
public boolean insertar(int llave) {
|
|
|
|
if (buscar(llave) == null) {
|
2016-07-04 11:38:26 -04:00
|
|
|
// Crear una listaEnlace y agregarla a la lista
|
|
|
|
ListaEnlace listaEnlace = new ListaEnlaceCircular();
|
2016-07-03 11:28:26 -04:00
|
|
|
|
|
|
|
if (primer == null) {
|
2016-07-04 11:38:26 -04:00
|
|
|
ultimo = listaEnlace;
|
2016-07-03 11:28:26 -04:00
|
|
|
}
|
|
|
|
|
2016-07-04 11:38:26 -04:00
|
|
|
listaEnlace.setLlave(llave);
|
|
|
|
listaEnlace.setSiguiente(primer);
|
|
|
|
primer = listaEnlace;
|
2016-07-03 11:28:26 -04:00
|
|
|
ultimo.setSiguiente(primer);
|
|
|
|
|
|
|
|
size++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// Se falló porque la llave ya existe
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Eliminar un enlace de la lista.
|
|
|
|
*
|
|
|
|
* @param llave int: La llave a elminiar.
|
|
|
|
*
|
|
|
|
* @return boolean: Verdad se fue eliminado, falso si no estaba en la lista.
|
|
|
|
*/
|
|
|
|
public boolean eliminar(int llave) {
|
|
|
|
if (primer != null) {
|
|
|
|
// La lista no es vacia
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.primer;
|
|
|
|
ListaEnlace previo = lista;
|
2016-07-03 11:28:26 -04:00
|
|
|
int i = 0;
|
|
|
|
while (lista.getLlave() != llave && i < size()) {
|
|
|
|
// Buscar hasta la llave es encontraddo
|
|
|
|
if (lista.getSiguiente() != null) {
|
|
|
|
// Buscar en la siguiente enlace
|
|
|
|
previo = lista;
|
2016-07-04 11:38:26 -04:00
|
|
|
lista = (ListaEnlace) lista.getSiguiente();
|
2016-07-03 11:28:26 -04:00
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lista.getLlave() != llave) {
|
|
|
|
// No se encontró
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Se encontró
|
|
|
|
if (lista == this.primer) {
|
|
|
|
// Si es la primera enlace, cambiarla al sigueinte enlace
|
2016-07-04 11:38:26 -04:00
|
|
|
this.primer = (ListaEnlace) this.primer.getSiguiente();
|
2016-07-03 11:28:26 -04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// Sino cortar esta enlace de la lista
|
|
|
|
previo.setSiguiente(lista.getSiguiente());
|
|
|
|
}
|
|
|
|
size--;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// La lista es vacia, no hay nada para eliminar
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-07-03 14:02:10 -04:00
|
|
|
/**
|
|
|
|
* Buscar una llave en la lista.
|
|
|
|
*
|
|
|
|
* @param llave int: La llave a buscar.
|
|
|
|
*
|
2016-07-04 11:38:26 -04:00
|
|
|
* @return ListaEnlace: El enlace que contiene la llave.
|
2016-07-03 14:02:10 -04:00
|
|
|
*/
|
2016-07-04 11:38:26 -04:00
|
|
|
public ListaEnlace buscar(int llave) {
|
2016-07-03 14:02:10 -04:00
|
|
|
if (this.primer != null) {
|
|
|
|
// La lista no es vacia
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.primer;
|
2016-07-03 14:02:10 -04:00
|
|
|
int i = 0;
|
|
|
|
while (lista.getLlave() != llave && i < size()) {
|
|
|
|
// Buscar en la sigenute enlace hasta el final.
|
2016-07-04 11:38:26 -04:00
|
|
|
lista = (ListaEnlace) lista.getSiguiente();
|
2016-07-03 14:02:10 -04:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
if (lista.getLlave() == llave) {
|
|
|
|
// Devoler el enlace encontrado.
|
|
|
|
return lista;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// No se encontró.
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// La lista es vacia, nada para buscar
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Devolver la cantidad de enlaces que están en la lista.
|
|
|
|
*
|
|
|
|
* @return int: La cantidad.
|
|
|
|
*/
|
|
|
|
public int size() {
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Devolver un enlace con su llave y valor.
|
|
|
|
*
|
|
|
|
* @param indice int: El indice que desea ver.
|
|
|
|
*
|
2016-07-04 11:38:26 -04:00
|
|
|
* @return ListaEnlace: El enlace a devolver.
|
2016-07-03 11:28:26 -04:00
|
|
|
*/
|
2016-07-04 11:38:26 -04:00
|
|
|
public ListaEnlace getIndice(int indice) {
|
2016-07-03 11:28:26 -04:00
|
|
|
if (primer != null && indice >= 0 && indice < size()) {
|
|
|
|
int i = size();
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.primer;
|
2016-07-03 11:28:26 -04:00
|
|
|
while (i > indice + 1) {
|
2016-07-04 11:38:26 -04:00
|
|
|
lista = (ListaEnlace) lista.getSiguiente();
|
2016-07-03 11:28:26 -04:00
|
|
|
i--;
|
|
|
|
}
|
|
|
|
return lista;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2016-06-27 14:47:49 -04:00
|
|
|
}
|