/**
*
* Title: Studio di implementazioni dell'adt Lista
* Description: Implementazione della lista mediante uso implicito dei puntatori
* Copyright: Copyright (c) Roberto Posenato
* Company: Università degli Studi di Verona
* @author Roberto Posenato
* @version 1.0
*
*/
//package Lista;
public class ListaLink implements Lista
{
private class Node {/*nodo della lista: deve contenere l'elemento
*e l'indirizzo del successivo
*/
Object key;
Node next;
Node(Object u) {
key = u;
next = null;
}
}
private Node head; //inzio della lista
private int nOggetti;//supporto
public ListaLink() {
head = null;
nOggetti = 0;
}
public boolean eVuota() {
return head == null;
}
public int lunghezza() { //si risparmia un sacco di tempo
return nOggetti;
}
public void cancella(int k) throws IllegalArgumentException {
// 0<=k= nOggetti))
throw new IllegalArgumentException();
else {
if (nOggetti == 1) {//e' l'unico elemento
head = null;
}
else {
if (k == 0) {//e' il primo elemento
head = head.next;
}
else {// e' un elemento generico
Node indice = head;
for (int i=0 ; i < k-1; i++)//cerco il nodo con posizione prima di quello da cancellare
indice = indice.next;
indice.next= indice.next.next;//cancello
}
}
nOggetti--;
}
}
public Object elemento(int k) throws IllegalArgumentException {
// 0<=k=nOggetti)
throw new IllegalArgumentException();
else {
Node indice = head;
for (int i=0 ; i < k; i++)
indice = indice.next;
return indice.key;
}
}
public void inserisci(int k, Object u) throws IllegalArgumentException {
// 0<=knOggetti)
throw new IllegalArgumentException();
else {
Node nuovo = new Node(u);
if (nOggetti == 0) {//e' il primo elemento da inserire
head = nuovo;
}
else {
if (k==0) { //è da inserire in testa
nuovo.next = head;
head = nuovo;
}
else {
Node indice = head;
for (int i=0 ; i < k-1; i++) //posizionati nell'elemento precedente a quello da inserire
indice = indice.next;
nuovo.next = indice.next; //al nuovo attacco il resto della lista
indice.next = nuovo; //all'elemento precedente attacco il nuovo
}
}
nOggetti++;
}
}
}