// classe per le liste public class L { protected int h; protected L t; public L(int h, L t) { this.h = h; this.t = t; } public int head() { return h; } public L tail() { return t; } public String toString(){ return "[" + convert() + "]"; } private String convert(){ if (t == null) return "" + h; else return h + ":" + t.convert(); } public Object clone() { if (t == null) return new L(h,null); else return new L(h,(L)(t.clone())); } // concatena questa lista con other e restituisce il risultato public L append(L other) { if (t == null) return new L(h,other); else return new L(h,t.append(other)); } // inverte questa lista e restituisce il risultato public L reverse() { if (t == null) //return this; return new L(h,null); else return t.reverse().append(new L(h,null)); } // inverte questa lista e restituisce il risultato, senza usare append() public L reverse_acc() { return reverse_acc(null); } private L reverse_acc(L acc) { if (t == null) return new L(h,acc); else return t.reverse_acc(new L(h,acc)); } // prende un elemento no e uno si' da una lista // e restituisce il risultato public L alternate() { if (t == null || t.t == null) return this; else return new L(h,t.t.alternate()); } // estrae gli elementi pari public L pari() { if (t== null){ if ((h / 2) * 2 == h) { return new L (h,null);//this; } else return null; } else if ((h / 2) * 2 == h) { return new L(h, t.pari()); } else return t.pari(); } }