
public class DoublyLinkedList {

	// Stmapa tutti gli elementi del vettore
	public static void printArray(int[] a) {
		int i;
		for (i=0 ; i<a.length ; i++) {
			System.out.println(a[i]);
		}
	}

	// Stampa tutti gli elementi della lista
	public static void printList(Cell c) {
		while (c != null) {
			System.out.println(c.x);
			c=c.next;
		}
	}
	
	// Rimuove una cella dalla lista
	public static void remove(Cell c) {
		Cell p = c.prev;
		Cell n = c.next;
		if (p != null) {
			// c non era all'inizio della lista
			p.next = n;
		}
		if (n != null) {
			// c non era alla fine della lista
			n.prev = p;
		}
		// Isoliamo la cella
		c.prev = null;
		c.next = null;
	}
	
	// Inserisce una cella toInsert dopo la cella c
	public static void insertAfter(Cell c, Cell toInsert) {
		Cell n = c.next;
		toInsert.prev = c;
		toInsert.next = n;
		c.next = toInsert;
		if (n != null) {
			// c non era alla fine della lista
			n.prev = toInsert;	
		}
	}
	
	// Converte un (suffisso di un) vettore a in lista, a partire da a[start]
	static Cell arrayToList(int[] a, int start) {
		if (start == a.length) {
			return null;
		}
		Cell c = new Cell(a[start]);
		c.next = arrayToList(a,start+1);
		if (c.next != null) {
			c.next.prev = c;
		}
		return c;
	}
	
	// Converte una lista in un vettore
	// Precondizone: size deve essere lungo quanto la lista
	static int[] listToArray(Cell l, int size) {
		int[] v = new int[size];
		int i;
		for (i=0 ; i < size ; i++) {
			v[i] = l.x;
			l = l.next;
		}
		return v;
	}
	
	
	public static void main(String[] args) {
		int[] a = { 0,1,2,3,4,5,6 };
		Cell l = arrayToList(a,0);
		System.out.println("=========== Lista creata da un array");
		printList(l);
		
		Cell r = l.next.next.next;
		System.out.println("=========== Rimuovo " + r.x);
		remove(r);
		printList(l);
		
		int n = 100;
		System.out.println("=========== Inserisco " + n);
		insertAfter(l.next.next, new Cell(n));
		printList(l);
		
		System.out.println("=========== Riconverto ad array");
		int[] a2 = listToArray(l, a.length); // tolto 1 aggiunto 1
		printArray(a2);
	}

}
