Estructuras_de_Datos/src/cl/cromer/estructuras/ListaEnlazada.java

238 lines
4.5 KiB
Java
Raw Normal View History

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 arbolTipo de listas enlazadas.
2016-07-04 12:37:35 -04:00
*
* @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
}