Pregunta 3 (2 ptos) Completar la clase Lista que implementa el TDA Lista (inmutable) de acuerdo a la especificación formal y métodos en Java adjuntos. Todos los métodos deben ejecutarse en un tiempo O (1). public class Lista { private class Celda { private Elemento elemento; private Celda sig; } private Celda inicio; ... } // fin class Lista Pregunta 4 (2 ptos) Completar la clase ListaUtil para listas pertenecientes al TDA Lista (inmutable) con la especificación formal y métodos en Java adjuntos. El método ordena puede utilizar un método auxiliar para la inserción de un elemento en una lista ordenada. Tanto el método ordena como su método auxiliar deben diseñarse recursivamente. public class ListaUtil { static public Lista ordena(Lista l) { // Devuelve una lista con los elementos de l ordenados de menor a mayor ... } } // fin class ListaUtil TDA Lista: Especificación Formal Tipo Lista (Elemento) Sintaxis listavacia → Lista inserta(Lista,Elemento) → Lista vacia(Lista) → booleano cabeza(Lista) → Elemento resto(Lista) → Lista Semántica ∀ L ∈ Lista, ∀ E ∈ Elemento vacia(listavacia) ⇒ cierto vacia(inserta(L,E)) ⇒ falso cabeza(listavacia) ⇒ error cabeza(inserta(L,E)) ⇒ E resto(listavacia) ⇒ error resto(inserta(L,E)) ⇒ L Clase Lista class Lista Constructores Lista() Lista(Lista l, Elemento e) Métodos boolean vacia() Elemento cabeza() Lista resto() Clase Elemento class Elemento Constructores Elemento() Métodos int valor() Resolución Examen (segunda parte) Pregunta 3 (2 ptos) public class Lista { private class Celda { private Elemento elemento; private Celda sig; } private Celda inicio; public Lista() { inicio = null; } public Lista (Lista l, Elemento e) { inicio = new Celda(); inicio.elemento = e; inicio.sig = l.inicio; } public boolean vacia() { return (inicio==null); } public Elemento cabeza() { return inicio.elemento; } public Lista resto() { Lista l = new Lista(); l.inicio = inicio.sig; return l; } } // fin class Lista Pregunta 4 (2 ptos) public class ListaUtil { static private Lista inserta_orden(Lista l, Elemento e) { if (l.vacia()) return new Lista(new Lista(),e); if (e.valor()<=l.cabeza().valor()) return new Lista(l,e); return new Lista(inserta_orden(l.resto(),e),l.cabeza()); } static public Lista ordena(Lista l) { // Devuelve una lista con los elementos de l ordenados de menor a mayor if (l.vacia()) return new Lista(); return inserta_orden(ordena(l.resto()),l.cabeza()); } } // fin class ListaUtil