176 lines
4.5 KiB
Java
176 lines
4.5 KiB
Java
|
package cl.cromer.estructuras;
|
||
|
|
||
|
public class ListaEnlazadaCircular {
|
||
|
/**
|
||
|
* El primer enlace.
|
||
|
*/
|
||
|
private Enlace primer;
|
||
|
/**
|
||
|
* El ultimo enlace.
|
||
|
*/
|
||
|
private Enlace ultimo;
|
||
|
|
||
|
/**
|
||
|
* 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 la cantidad de enlaces que están en la lista.
|
||
|
* @return int: La cantidad.
|
||
|
*/
|
||
|
public int size() {
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Buscar una llave en la lista.
|
||
|
* @param llave int: La llave a buscar.
|
||
|
* @return Enlace: El enlace que contiene la llave.
|
||
|
*/
|
||
|
public Enlace buscar(int llave) {
|
||
|
if (this.primer != null) {
|
||
|
// La lista no es vacia
|
||
|
Enlace lista = this.primer;
|
||
|
int i = 0;
|
||
|
while (lista.getLlave() != llave && i < size()) {
|
||
|
// Buscar en la sigenute enlace hasta el final.
|
||
|
lista = (Enlace) lista.getSiguente();
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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) {
|
||
|
// Crear una enlace y agregarla a la lista
|
||
|
Enlace enlace = new EnlaceCircular();
|
||
|
|
||
|
if (primer == null) {
|
||
|
ultimo = enlace;
|
||
|
}
|
||
|
|
||
|
enlace.setLlave(llave);
|
||
|
enlace.setSiguente(primer);
|
||
|
primer = enlace;
|
||
|
ultimo.setSiguente(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
|
||
|
Enlace lista = this.primer;
|
||
|
Enlace previo = lista;
|
||
|
int i = 0;
|
||
|
while (lista.getLlave() != llave && i < size()) {
|
||
|
// Buscar hasta la llave es encontraddo
|
||
|
if (lista.getSiguente() != null) {
|
||
|
// Buscar en la sigenute enlace
|
||
|
previo = lista;
|
||
|
lista = (Enlace) lista.getSiguente();
|
||
|
}
|
||
|
else {
|
||
|
// No se encuentra
|
||
|
return false;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
// Se encontró
|
||
|
if (lista == this.primer) {
|
||
|
// Si es la primera enlace, cambiarla al siguente enlace
|
||
|
this.primer = (Enlace) this.primer.getSiguente();
|
||
|
}
|
||
|
else {
|
||
|
// Sino cortar esta enlace de la lista
|
||
|
previo.setSiguente(lista.getSiguente());
|
||
|
}
|
||
|
size--;
|
||
|
return true;
|
||
|
}
|
||
|
else {
|
||
|
// La lista es vacia, no hay nada para eliminar
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Devolver un enlace con su llave y valor.
|
||
|
* @param indice int: El indice que desea ver.
|
||
|
* @return Enlace: El enlace a devolver.
|
||
|
*/
|
||
|
public Enlace getIndice(int indice) {
|
||
|
if (primer != null && indice >= 0 && indice < size()) {
|
||
|
int i = size();
|
||
|
Enlace lista = this.primer;
|
||
|
while (i > indice + 1) {
|
||
|
lista = (Enlace) lista.getSiguente();
|
||
|
i--;
|
||
|
}
|
||
|
return lista;
|
||
|
}
|
||
|
else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|