Foro sobre Java SE > Ejercicio Lista Enlazada
Hola, te sugiero que modeles tus algoritmos de manera grafica (usando cuadraditos y flechitas :D ) y trata de usar algoritmos recursivos porque con los algoritmos iterativos pueden ser un poco dificiles, te ayudo con los metodos más faciles:
public int numeroElementos(){
return contar(cabecera);
}
/* Este es un metodo auxiliar que ayuda a contar los elementos de la lista recursivamente */
private int contar(Enlace enlace){
if(enlace.getEnlace()==null)
return 0;
else
return 1+contar(enlace.getEnlace());
}
public void insertarAlFinal(Object elemento){
insertar(cabecera,elemento);
}
/* Metodo auxiliar que ayuda a insertar un elemento al final de la lista recursivamente */
private void insertar(Enlace enlace,Object elemento){
if(enlace.getEnlace()==null){
Enlace temp=new Enlace(elemento);
enlace.setEnlace(temp);
}else{
insertar(enlace.getEnlace(),elemento);
}
}
Suerte
gracias pero tengo que utilizar las expresiones que he puesto en el post.
por favor un poco de ayuda con la parte que no soy capaz de realizar
gracias
Creo que la clase Nodo seria algo asi:
public class Nodo{
private Object dato;
private Nodo siguiente;
public Nodo(Object dato,Nodo siguiente){
this.dato = dato;
this.siguiente = siguiente;
}
public void setDato(Object dato){
this.dato = dato;
}
public void setSiguiente(Nodo siguiente){
this.siguiente = siguiente;
}
public Object getDato(){
return this.dato;
}
public Nodo getSiguiente(){
return this.siguiente;
}
}
la clase Lista asi
public class Lista{
private Nodo cabecera;
public Lista(){
cabecera = new Nodo(null,null);
}
public void adjuntar(Object dato){
Nodo temp = cabecera;
while(temp.getSiguiente() != null){
temp = temp.getSiguiente();
}
temp.setSiguiente(new Nodo(dato,null));
}
public void recorrer(){
Nodo temp = cabecera.getSiguiente();
if(temp != null){
do{
System.out.println(temp.getDato().toString());
temp = temp.getSiguiente();
}while(temp != null);
}
}
}
y ya para probar:
public class probando{
public static void main(String []args){
Lista lista = new Lista();
lista.adjuntar("a");
lista.adjuntar("b");
lista.adjuntar("c");
lista.adjuntar("d");
lista.adjuntar("e");
lista.recorrer();
}
}
NOTA: es para que te guies, yo lo hice y me funciono, espero te sirva
gracias, en cuanto tenga u rato me pongo pero lo que no me aclaro nada es con:
public boolean hasMoreElements()
public Object nextElement()
public Object nextElement(), hasta donde se, este método dentro de una lista te devolvería un elemento de este, si lo vuelves a llama te devolvería otro en su respectivo orden.
que no soy capaz de hacerlo como me piden
Intenta, y si tienes problemas comunicalos por este mismo medio.
ya he perdido la cuenta de cuantos enlaces he buscado por internet para ver la forma de hacer lo que me piden y he ido probando con casi todos y ninguno me coincide y siempre me salen errores que ya no tengo ni idea, tengo un cacao mental ahora mismo que haga lo que haga todo me sale mal, sobre todo con la presion de que tengo que entregar el ejercicio para aprobar el curso.
hay muchos tutoriales pero ninguno se adapta al ejercicio, yo los adapto como puedo pero nada.
Estoy ya por darme por vencido y dejarlo todo.
ya tengo realizado esta parte
ahora como tengo que hacer para insertar elementos y probar?
---------------------------------------------------------------
import java.util.*;
@SuppressWarnings("rawtypes")
public class ListaEnlazada implements Enumeration {
Enlace cabecera, cola, actual;
int longitud;
public ListaEnlazada(){
cabecera=null;
cola=null;
actual=null;
longitud=0;
}
public int numeroElementos() {
return longitud;
}
public boolean esVacia(){
return cabecera==null && cola==null;
}
public Object elementoActual() {
return actual;
}
public void insertarAlFinal(Object elemento) {
Enlace nuevo=new Enlace(elemento);
if (esVacia()){
cabecera=nuevo;
}
else
{
Enlace actual=cabecera;
while(actual.getSiguiente()!=null) {
actual=actual.getSiguiente();
}
actual.setSiguiente(nuevo);
}
}
public void reiniciar()
{
longitud = 0;
cabecera=null;
cola=null;
actual = null;
}
public boolean hasMoreElements()
{
return (actual.getSiguiente() != null);
}
public Object nextElement()
{
Object result;
result = actual.getElemento();
actual = actual.getSiguiente();
return result;
}
}
Crea un instancia del tipo lista y llama a los metodos:
algo asi.
class probar{
public static void main(String []args){
ListaEnlazada listaEnlazada = new ListaEnlazada();
listaEnlazada.insertarAlFinal("Hola");
listaEnlazada.insertarAlFinal("Mundo");
listaEnlazada.insertarAlFinal("Aqui");
listaEnlazada.insertarAlFinal("Estoy");
System.out.println(listaEnlazada.nextElement());
System.out.println(listaEnlazada.nextElement());
System.out.println(listaEnlazada.nextElement());
System.out.println(listaEnlazada.nextElement());
}
}
aquí estoy de nuevo con otro ejercicio que cada vez se complican mas:
1.-
Implementar un clase denominada “Enlace” que contenga un elemento
Object y una referencia a otro objeto “Enlace”, según el siguiente diagrama
de clases:
Enlace
----------
Objeto elemento
Enlace siguiente
----------
public Object getElemento()
public Enlace getSiguiente()
public void setElemento(Object elemento)
public void setSiguiente(Enlace siguiente)
2.
Crear la clase “ListaEnlazada” que implemente el interfaz
Enumeration y que represente una lista donde cada nodo
contiene un objeto y la referencia al siguiente nodo
(apoyándose en la clase “Enlace”),
public class ListaEnlazada implements Enumeration {
Enlace cabecera, cola, previo, longitud;
int longitud;
public int numeroElementos()
public boolean esVacia()
public Object elementoActual()
public void insertarAlFinal(Object elemento)
public void reiniciar()
public boolean hasMoreElements()
public Object nextElement()
Descripción de los atributos:
• cabecera: Es un objeto “Enlace” que indica cual es primer nodo
de la lista. Si la lista está vacía será null.
• cola: Representa al último nodo de la lista. Si la lista está vacía
será null.
• actual: La lista enlazada contempla que pueda ser recorrida
secuencialmente. La variable “actual” nos indica cual ha sido el
último nodo accedido a través del método nextElement().
Cuando el valor de “actual” sea null, el objeto a devolver con
nextElement() será el primero de la lista.
• longitud: Número de nodos de la lista.
Descripción de los métodos
• numeroElementos(): Permite obtener el tamaño, es decir la longitud de la lista
• esVacia(). Devuelve un booleano si la lista no contiene objetos.
• elementoActual(): Devuelve el elemento contenido en el objeto Enlace
referenciado por “actual”.
• reiniciar(): Pone la variable “actual” a null. De modo que elementoActual()
devuelve null y nextElement() devuelve el primer elemento.
• hasMoreElements(): Devuelve true si la lista no está vacía y quedan elementos
por recorrer.
• nextElement(): Devuelve el siguiente objeto del elemento actual, avanzando una
posición en la lista.
• insertarAlFinal(): Añade un elemento al final de la lista.
• Se crea un objeto Enlace.
• Si la lista está vacía el nuevo elemento es la cabecera y la cola.
• SI la lista no está vacía:
• Actualiza la referencia “siguiente” de la variable “cola” al nuevo objeto.
• Modifica la referencia “cola”, ya que el nuevo elemento pasa a ser la cola.
• Incrementamos la longitud.
Realizar una clase OperarLista con un método main que opere
con la lista.
• Añadir 5 elementos que sean String “uno”, “dos”, “tres”,
“cuatro” y “cinco”
• Recorrer desde el inicio los elementos de la lista secuencialmente
con los métodos de la clase ListaEnlazada, hasMoreElements() y
nextElement()
He conseguido realizar lo siguiente que no se si esta bien pero ya me he quedado estancado y no se como seguir con lo que me falta:
public class Enlace {
private Object elemento;
private Enlace siguiente;
public Enlace (Object n) {
elemento=n;
siguiente=null;
}
public Object getElemento(){
return elemento;
}
public Enlace getSiguiente(){
return siguiente;
}
public void setElemento(Object elemento) {
this.elemento=elemento;
}
public void setSiguiente(Enlace siguiente) {
this.siguiente=siguiente;
}
}
-------------------------------------------------
import java.util.*;
public class ListaEnlazada implements Enumeration {
Enlace cabecera, cola, previo, longitud;
int longitud;
public int numeroElementos() {
}
public boolean esVacia(){
return cabecera==null && cola==null;
}
public Object elementoActual() {
}
public void insertarAlFinal(Object elemento) {
Enlace nuevo=new Enlace (elemento);
if (esVacia()){
cabecera=nuevo;
}
else
{
Enlace actual=cabecera;
while(actual.getSiguiente()!=null) {
actual=actual.getSiguiente();
}
actual.setSiguiente(nuevo);
}
}
{
}
public void reiniciar(){
}
public boolean hasMoreElements() {
}
public Object nextElement() {
}
}