2016-06-20 13:25:01 -04:00
|
|
|
package cl.cromer.estructuras;
|
|
|
|
|
2016-06-26 13:25:51 -04:00
|
|
|
/**
|
|
|
|
* Crear una estructura de dato de tipo lista enlazada.
|
2016-06-29 00:33:19 -04:00
|
|
|
*
|
2016-06-26 13:25:51 -04:00
|
|
|
* @author Chris Cromer
|
|
|
|
*/
|
|
|
|
final public class ListaEnlazada {
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* El enlace principal de la lista.
|
|
|
|
*/
|
2016-07-04 11:38:26 -04:00
|
|
|
private ListaEnlace lista;
|
2016-06-20 13:25:01 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* La cantidad de enlaces que están en la lista.
|
|
|
|
*/
|
|
|
|
private int size;
|
2016-06-25 14:14:17 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* El tipo de lista enlazada.
|
|
|
|
*/
|
|
|
|
private int tipo;
|
2016-06-25 14:14:17 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Inicilizar.
|
|
|
|
*/
|
|
|
|
public ListaEnlazada() {
|
|
|
|
lista = null;
|
|
|
|
}
|
2016-06-20 13:25:01 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Devolver el tipo de lista.
|
|
|
|
*
|
|
|
|
* @return int: El tipo.
|
|
|
|
*/
|
|
|
|
public int getTipo() {
|
|
|
|
return tipo;
|
|
|
|
}
|
2016-06-25 14:14:17 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Cambiar el tipo de lista.
|
|
|
|
*
|
|
|
|
* @param tipo int: El tipo a cambiar.
|
|
|
|
*/
|
|
|
|
public void setTipo(int tipo) {
|
|
|
|
this.tipo = tipo;
|
|
|
|
}
|
2016-06-25 14:14:17 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Insertar una llave en la lista.
|
|
|
|
*
|
|
|
|
* @param llave int: La llave a insertar.
|
|
|
|
*
|
|
|
|
* @return boolean: Verdad si fue insertado, sino falso.
|
|
|
|
*/
|
|
|
|
public boolean insertar(int llave) {
|
|
|
|
if (buscar(llave) == null) {
|
|
|
|
// Crear una enlace y agregarla a la lista
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace nuevo = new ListaEnlaceNormal();
|
2016-07-03 11:28:26 -04:00
|
|
|
nuevo.setLlave(llave);
|
|
|
|
nuevo.setSiguiente(lista);
|
|
|
|
if (lista != null) {
|
|
|
|
lista.setPrevio(nuevo);
|
|
|
|
}
|
|
|
|
lista = nuevo;
|
|
|
|
size++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// Se falló porque la llave ya existe
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
2016-06-25 14:14:17 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Eliminar un enlace de la lista.
|
|
|
|
*
|
|
|
|
* @param llave int: La llave a eliminar.
|
|
|
|
*
|
|
|
|
* @return boolean: Verdad si fue borrado, sino falso.
|
|
|
|
*/
|
|
|
|
public boolean eliminar(int llave) {
|
|
|
|
if (lista != null) {
|
|
|
|
// La lista no es vacia
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.lista;
|
|
|
|
ListaEnlace previo = lista;
|
2016-07-03 11:28:26 -04:00
|
|
|
while (lista.getLlave() != llave) {
|
|
|
|
// 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
|
|
|
}
|
|
|
|
else {
|
|
|
|
// No se encuentra
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Se encontró
|
|
|
|
if (lista == this.lista) {
|
|
|
|
// Si es la primera enlace, cambiarla al siguiente enlace
|
2016-07-04 11:38:26 -04:00
|
|
|
this.lista = (ListaEnlace) this.lista.getSiguiente();
|
2016-07-03 11:28:26 -04:00
|
|
|
if (this.lista.getPrevio() != null) {
|
|
|
|
this.lista.setPrevio(null);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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-06-20 13:25:01 -04:00
|
|
|
|
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 buscada.
|
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.lista != null) {
|
|
|
|
// La lista no es vacia
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.lista;
|
2016-07-03 14:02:10 -04:00
|
|
|
while (lista.getLlave() != llave) {
|
|
|
|
// Buscar hasta la llave es encontrado
|
|
|
|
if (lista.getSiguiente() != null) {
|
|
|
|
// Buscar en la siguiente enlace
|
2016-07-04 11:38:26 -04:00
|
|
|
lista = (ListaEnlace) lista.getSiguiente();
|
2016-07-03 14:02:10 -04:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// No se encuentra
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Se encontró
|
|
|
|
return lista;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// La lista es vacia, nada para buscar
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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 (lista != null && indice >= 0 && indice < size()) {
|
|
|
|
int i = size();
|
2016-07-04 11:38:26 -04:00
|
|
|
ListaEnlace lista = this.lista;
|
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-20 13:25:01 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
/**
|
|
|
|
* Devolver la cantidad de enlaces que están en la lista.
|
|
|
|
*
|
|
|
|
* @return int: La cantidad.
|
|
|
|
*/
|
|
|
|
public int size() {
|
|
|
|
return size;
|
|
|
|
}
|
2016-07-04 12:37:35 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Esta clase contiene los tipos de listas enlazadas.
|
|
|
|
*
|
|
|
|
* @author Chris Cromer
|
|
|
|
*/
|
|
|
|
final static public class Tipos {
|
|
|
|
/**
|
|
|
|
* Tipo simple.
|
|
|
|
*/
|
|
|
|
static final public int SIMPLE = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tipo circular.
|
|
|
|
*/
|
|
|
|
static final public int CIRCULAR = 1;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Tipo doblemente enlazada.
|
|
|
|
*/
|
|
|
|
static final public int DOBLEMENTE_ENLAZADA = 2;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* El tipo elegido.
|
|
|
|
*/
|
|
|
|
final private int tipo;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inicilizar el tipo de lista enlazada.
|
|
|
|
*
|
|
|
|
* @param tipo int: El tipo de lista enlazada, {@value #SIMPLE}, {@value #CIRCULAR} o {@value #DOBLEMENTE_ENLAZADA}
|
|
|
|
*/
|
|
|
|
public Tipos(int tipo) {
|
|
|
|
switch (tipo) {
|
|
|
|
case SIMPLE:
|
|
|
|
this.tipo = SIMPLE;
|
|
|
|
break;
|
|
|
|
case CIRCULAR:
|
|
|
|
this.tipo = CIRCULAR;
|
|
|
|
break;
|
|
|
|
case DOBLEMENTE_ENLAZADA:
|
|
|
|
this.tipo = DOBLEMENTE_ENLAZADA;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
this.tipo = SIMPLE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Devolver el tipo de lista enlazada.
|
|
|
|
*
|
|
|
|
* @return int: El tipo.
|
|
|
|
*/
|
|
|
|
public int getTipo() {
|
|
|
|
return tipo;
|
|
|
|
}
|
|
|
|
}
|
2016-06-30 16:08:43 -04:00
|
|
|
}
|