public class Lista {
class Nodo {
private int data; //informazione
private Nodo next; //riferimento al prossimo nodo nella lista
Nodo(int elem) {
data = elem;
next=null;
}
}
Nodo testa;
...
}
Lista(){
testa = null;
}
public boolean empty() {
return testa == null;
}
public boolean full() {
return false;
}
Azione: inserimento in testa
Precondizione: la lista non è piena
private void push(int e) {
Nodo q = new Nodo(e);
q.next = testa;
testa = q;
}
Cosa fa:
- creiamo un oggetto nodo con un certo contenuto informativo e con puntatore a null
2a. se la lista è vuota la testa punta a null. Per assegnazione faccio puntare la testa al nuovo ogg.
2b. se la lista non è vuota, il next del nuovo nodo verrà fatto puntare al primo elemento, e la testa verrà fatta puntare alla testa del nuovo nodo (IN QUESTO ORDINE)
Azione: inserimento in coda
Precondizione: la lista non è piena
public void append(int e) {
if(empty()) push(e);
else {
Nodo temp = testa;
Nodo q= new Nodo(e);
while(temp.next!=null) temp = temp.next;
temp.next = q;
}
}
Azione:
Precondizione: la lista è ordinata in senso crescente
public void inserisci(int e) {
// se la lista è vuota eseguo il push
if(empty() || testa.data>=e) push(e);
else {
Nodo temp = testa;
Nodo q = new Nodo(e);
while(temp.next!=null && temp.next.data<e)
temp = temp.next;
q.next = temp.next;
temp.next = q;
}
}
Azione: preleva elemento in testa e aggiorna puntatore testa
Precondizione: la lista non è vuota
public int pop() {
int e = testa.data;
testa = testa.next;
return e;
}
Azione: preleva elemento in testa (non aggiorna puntatore!!)
Precondizione: la lista non è vuota
public int top() {
int e = testa.data;
return e;
}
Azione:
Precondizione: la lista non è vuota
public int pop_back() {
if(testa.next==null) return pop();
else {
Nodo temp = testa;
while(temp.next.next!=null) temp = temp.next;
int e = temp.next.data;
temp.next=null;
return e;
}
}
Azione:
Precondizione: la lista non è vuota
public int top_back() {
if(testa.next==null) return top();
else {
Nodo temp = testa;
while(temp.next.next!=null) temp = temp.next;
int e = temp.next.data;
return e;
}
}
Azione: viene eliminata la prima occorrenza dell'elemento
Precondizione: la lista non è vuota e l'elemento è presente
public void elimina(int e){
if(testa.data == e) pop();
else {
Nodo temp = testa;
while(temp.next.data!=e) temp = temp.next;
temp.next = temp.next.next;
}
}
Azione: restituisce true o false se l'elemento è in lista o meno
public boolean inLista(int e) {
boolean trovato = false;
Nodo temp = testa;
while(temp!=null && !trovato)
if(temp.data==e)
trovato = true;
else temp = temp.next;
return trovato;
}
Azione: restituisce true o false se la lista è ordinata o meno
public boolean isOrdered () {
boolean ordinato = true;
Nodo temp = testa;
if (temp == null) return true;
if (temp.next == null) return true;
if (temp.next.next == null) {
return temp.data<=temp.next.data;
}
// una lista vuota o con un solo elemento è ordinata
while (ordinato && temp.next!=null) {
if (temp.data>temp.next.data) {
ordinato = false;
} else {
temp = temp.next;
}
}
return ordinato;
}
Azione: stampa la lista
Precondizione: la lista non è vuota
public void stampa(){
Nodo temp = testa;
while(temp!=null) {
System.out.println(temp.data);
temp = temp.next;
}
}