Lista.java
1 /**
2 * Lista.java
3 * @author Luis Alejandro Bernal Romero.
4 * El TDA Lista recursiva.
5 */
6
7 public class Lista {
8 private Object info;
9 private Lista cola;
10
11 /**
12 * Constructor para una lista de un solo elemento.
13 * @param i La información.
14 */
15 public Lista(Object i){
16 info = i;
17 cola = null;
18 }
19
20 /**
21 * Constructor para una lista de más de un elemento.
22 * @param i La información
23 * @param c La lista cola
24 */
25 public Lista(Object i, Lista c){
26 info = i;
27 cola = c;
28 }
29
30 /**
31 * Obtiene la cola de la lista.
32 * @return Cola de la lista.
33 */
34 public Lista obtCola(){
35 return cola;
36 }
37
38 /**
39 * Obtiene la información de la lista.
40 * @return La información.
41 */
42 public Object obtInfo(){
43 return info;
44 }
45
46 /**
47 * Obtiene la información del "n"-esimo nodo.
48 * @param n La posición del nodo.
49 * @return La información del nodo.
50 */
51 public Object obtInfo(int n){
52 if(n == 0){
53 return info;
54 }
55 if(cola != null){
56 return cola.obtInfo(n - 1);
57 }
58 return null;
59 }
60
61 /**
62 * Busca la información "i" en la lista retornando la sublista cuya cabeza contiene
63 * la información. Si no la encuentra retorna null.
64 * @param i La información a buscar.
65 * @return La sublista cuya cabeza tiene la información, retorna null sino la
66 * encuentra.
67 */
68 public Lista buscar(Object i){
69 if(info.equals(i)){
70 return this;
71 }
72 if(cola != null){
73 return cola.buscar(i);
74 }
75 return null;
76 }
77
78 /**
79 * Cuenta en numero de nodos de la lista.
80 * @return El numero de nodos de la lista.
81 */
82 public int contar(){
83 if(cola == null){
84 return 1;
85 }
86 return 1 + cola.contar();
87 }
88
89 /**
90 * Convierte a cadena la lista. Por ejemplo, para imprimirla.
91 */
92 public String toString(){
93 String cad = "(";
94 cad += info;
95 if(cola != null){
96 cad += "," + cola;
97 }
98 cad += ")";
99 return cad;
100 }
101
102 /**
103 * Adiciona la Lista "l" al final de la lista.
104 * @param l Lista que se va a adicionar.
105 */
106 public void adicionar(Lista l){
107 if(cola == null){
108 cola = l;
109 }
110 else{
111 cola.adicionar(l);
112 }
113 }
114
115 /**
116 * Inserta la Lista "l" después de la cabeza.
117 * @param l La Lista a insertar.
118 */
119 public void insertar(Lista l){
120 if(cola == null){
121 cola = l;
122 }
123 else{
124 l.adicionar(cola);
125 cola = l;
126 }
127 }
128
129 /**
130 * Inserta la lista "l" después de la posición "n". Si no existe la posición la
131 * inserta al final.
132 * @param n Posición a insertar.
133 * @param l La Lista que se va a insertar.
134 */
135 public void insertar(int n, Lista l){
136 if(n == 1){
137 insertar(l);
138 }
139 else{
140 if(cola != null){
141 cola.insertar(n - 1, l);
142 }
143 else {
144 cola = l;
145 }
146 }
147 }
148
149 /**
150 * Elimina el nodo después de la cabeza retornándolo.
151 * @return El nodo final.
152 */
153 public Lista eliminar(){
154 Lista c = cola;
155 if(cola != null){
156 cola = cola.cola;
157 c.cola = null;
158 }
159 return c;
160 }
161
162 /**
163 * Elimina el "n"-esimo nodo de la Lista retornándolo.
164 * @param n La posición del nodo.
165 * @return El nodo que se elimina.
166 */
167 public Lista eliminar(int n){
168 if(n == 2){
169 return eliminar();
170 }
171 if(cola != null){
172 return cola.eliminar(n - 1);
173 }
174 return null;
175 }
176
177 /**
178 * Elimina la cabeza de la sublista "l" retornándola.
179 * @param l La sublista cuya cabeza se eliminará.
180 * @return La cabeza.
181 */
182 public Lista eliminar(Lista l){
183 if(cola == null){
184 return null;
185 }
186 if(cola.equals(l)){
187 return eliminar();
188 }
189 return cola.eliminar(l);
190 }
191
192 /**
193 * Saca una copia de la sublista de la cola.
194 * @return La sublista.
195 */
196 public Lista subLista(){
197 if(cola != null){
198 return new Lista(cola.info, cola.subLista());
199 }
200 return null;
201 }
202
203 /**
204 * Hace una copia de la sublista que va desde la posición "n" hasta la "m".
205 * @param n Posición inicial
206 * @param m Posición final
207 * @return La sublista
208 */
209 public Lista subLista(int n, int m){
210 return subLista(n, m, 1);
211 }
212
213 private Lista subLista(int n, int m, int i){
214 if(i >= n && i < m){
215 if(cola != null){
216 return new Lista(info, cola.subLista(n, m, i + 1));
217 }
218 return new Lista(info);
219 }
220 if(cola != null){
221 return cola.subLista(n, m, i + 1);
222 }
223 return null;
224 }
225 } // class Lista
