Debido a que son listas doblemente enlazadas, la eliminación de un nodo en específico ya no necesitará de dos nodos auxiliares, solamente uno que será para recorrer. ¡Muchas gracias maestro!
No sería más fácil crear un método en la clase principal para manejar de forma más fácil un JOptionPane sin tanto argumento: Algo como esto: // Un simple JOptionPane public void msg(String msg, String title, int type){ JOptionPane.showMessageDialog(null, msg, title, type); } // Obtener un valor numérico de un JOptionPane public int parseFromDialog(String msg, String title, int type) { return Integer.parseInt(msg(msg, title, type)); }
Método para borrar un elemento cualquiera de la lista y borrarlo -> public void borrarElemento(int elemento){ if(!estaVacia()){ if(estaEnLista(elemento)){ if(inicio==fin && inicio.dato == elemento){ //solo hay un elemento y coincide con el buscado inicio=null; fin = null; }else{ if(inicio.dato==elemento){ //si el elemento a borrar es el primero de la lista inicio=inicio.siguiente; inicio.anterior=null; } else{ if(fin.dato==elemento){ //si el elemento a borrar es el ultimo de la fila fin=fin.anterior; fin.siguiente=null; } else{ //partimos en la busqueda desde el principio //pero tambien lo podiamos hacer desde el final .. que para eso es enlazada NodoDoble borrar = inicio; //apuntamos con aux al nodo que queremos borrar while(borrar.dato!=elemento){ borrar=borrar.siguiente; } //ya estamos apuntando al puntero que queremos borrar //ahora debemos acoplar los punteros que se quedan ligando sus punteros //para eso partimos del aux como referencia borrar.anterior.siguiente = borrar.siguiente; borrar.siguiente.anterior=borrar.anterior; } } } }else{ System.out.println("El elemento que quieres borrar no esta en la lista"); } }else{ System.out.println(" \tLa lista esta vacia."); } }
El metodo que implemente para borrar un elemento en especifico public void eliminarNodoUnico(int el){ if(estaVacia()){ System.out.println("Lista vacia"); } else if(fin == inicio){ if(el == inicio.dato){ fin = inicio = null; } else{ System.out.println("Error"); } } else if(el == inicio.dato){
@@battle.axe199 Eso es lo mas facil, solo pon el metodo con el case y no se te olvide actualizar el while del do while, lo mas dificil es crear el metodo.
solo te faltaría la condición a cuando el elemento a eliminar es el ultimo, solo seria agregar un else if y ya: else if(ultimo == el){ ultimo = ultimo.previous; ultimo.siguiente = null; }
Es la primera vez que veo tus videos sr me parece excelente gracias
Debido a que son listas doblemente enlazadas, la eliminación de un nodo en específico ya no necesitará de dos nodos auxiliares, solamente uno que será para recorrer. ¡Muchas gracias maestro!
Este curso está genial, le entiendo mil veces mejor que al profe de la universidad
Muy Bueno era justo lo que estaba buscando....
esta muy bien .. pero si pudieras eliminar un nodo en especifico con su respectivo case fuera genial
Una pregunta, como sería el método para eliminar de enmedio?
No sería más fácil crear un método en la clase principal para manejar de forma más fácil un JOptionPane sin tanto argumento:
Algo como esto:
// Un simple JOptionPane
public void msg(String msg, String title, int type){
JOptionPane.showMessageDialog(null, msg, title, type);
}
// Obtener un valor numérico de un JOptionPane
public int parseFromDialog(String msg, String title, int type) {
return Integer.parseInt(msg(msg, title, type));
}
//Metodo para eliminar cualquier nodo(inicio, intermedio o el ultimo)
public int eliminarCualquierElemento(int elemento) {
NodoDoble temp = inicio;
if (inicio == fin && temp.dato == elemento) {
inicio = fin = null;
}else{
if (!listaEstaVacia()) {
while (temp != null && temp.dato != elemento) {
temp = temp.siguiente;
}
}
if (temp != null) {
if (temp != inicio) {
if (temp != fin) {
temp.siguiente.anterior = temp.anterior;
temp.anterior.siguiente = temp.siguiente;
} else {//eliminar del final
fin = fin.anterior;
fin.siguiente = null;
}
} else {//eliminar del inicial
inicio = inicio.siguiente;
inicio.anterior = null;
}
}
}
return elemento;
}
Gracias me has salvado
@@rociomendoza2522 No hay de que 😃
Está muy bueno el curso. Si pudiera explicar cómo buscar un elemento y eliminarlo.
y si quiero añadir junto a los enteros otro tipo de valor y se guarden ambos? trate de usar la misma estructura pero me da error
Puedes usar Object como tipo de dato, también el nombre de una clase donde tengas un tus atributos y un constructor
Podrias subir el archivo para verlo completo? muy bien explicado pero no se ve lo del principio
gracias
Y cual es el algoritmo para buscar un elemento?
public boolean datoDentroLista(int dato){
NodoDoble auxiliar = inicio;
boolean validar = false;
while(auxiliar!=null && auxiliar.dato != dato){
auxiliar = auxiliar.siguiente;
validar = true;
}
return validar;
}
Método para borrar un elemento cualquiera de la lista y borrarlo ->
public void borrarElemento(int elemento){
if(!estaVacia()){
if(estaEnLista(elemento)){
if(inicio==fin && inicio.dato == elemento){ //solo hay un elemento y coincide con el buscado
inicio=null;
fin = null;
}else{
if(inicio.dato==elemento){ //si el elemento a borrar es el primero de la lista
inicio=inicio.siguiente;
inicio.anterior=null;
}
else{
if(fin.dato==elemento){ //si el elemento a borrar es el ultimo de la fila
fin=fin.anterior;
fin.siguiente=null;
}
else{
//partimos en la busqueda desde el principio
//pero tambien lo podiamos hacer desde el final .. que para eso es enlazada
NodoDoble borrar = inicio;
//apuntamos con aux al nodo que queremos borrar
while(borrar.dato!=elemento){
borrar=borrar.siguiente;
}
//ya estamos apuntando al puntero que queremos borrar
//ahora debemos acoplar los punteros que se quedan ligando sus punteros
//para eso partimos del aux como referencia
borrar.anterior.siguiente = borrar.siguiente;
borrar.siguiente.anterior=borrar.anterior;
}
}
}
}else{
System.out.println("El elemento que quieres borrar no esta en la lista");
}
}else{
System.out.println("
\tLa lista esta vacia.");
}
}
El metodo que implemente para borrar un elemento en especifico
public void eliminarNodoUnico(int el){
if(estaVacia()){
System.out.println("Lista vacia");
}
else if(fin == inicio){
if(el == inicio.dato){
fin = inicio = null;
}
else{
System.out.println("Error");
}
}
else if(el == inicio.dato){
inicio = inicio.siguiente;
inicio.anterior = null;
}
else{
NodoDoble temporal, anterior, siguiente;
temporal = inicio;
siguiente = inicio;
anterior = inicio;
while(siguiente != null && siguiente.dato != el){
temporal = temporal.siguiente;
siguiente = siguiente.siguiente;
anterior = anterior.siguiente;
}
if(siguiente != null && siguiente != fin){
siguiente.siguiente.anterior = temporal.anterior;
anterior.anterior.siguiente = temporal.siguiente;
}
else{
if(siguiente == fin){
fin = fin.anterior;
fin.siguiente = null;
}
}
}
}
Y en la clase principal, qué código utilizaste para que se muestre?? En los case...
Me podrías ayudar con eso?
@@battle.axe199 Eso es lo mas facil, solo pon el metodo con el case y no se te olvide actualizar el while del do while, lo mas dificil es crear el metodo.
solo te faltaría la condición a cuando el elemento a eliminar es el ultimo, solo seria agregar un else if y ya:
else if(ultimo == el){
ultimo = ultimo.previous;
ultimo.siguiente = null;
}
Esta bien el codigo, pero ocupo un metodo de imprimir para hacerlo desde consola