|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 3577
|
[Java][LinkedList]
devo fare un esercizio in preparazione di un esame universitario, ma non riesco a uscirne fuori
la cosa da cui proprio non riesco a cavarmi fuori è come fare a puntare ciclicamente all' elemento next, dovendo passare per head questa è la classe: public class ListLinked { private Node head; private class Node { private String content; private Node next; public Node(String c, Node n) { content = c; next = n; } public Node(String c) { this(c, null); } } public ListLinked() { head = null; } public boolean isEmpty() { return head == null; } public void addToStart(String s) { Node newNode = new Node(s, head); head = newNode; } public static ListLinked cons(String c, ListLinked l) { ListLinked result = new ListLinked(); result.addToStart(c); if (l != null) result.head.next = l.head; return result; } public String first() { return isEmpty() ? null : head.content; } public ListLinked rest() { if (isEmpty()) { return null; } else { ListLinked result = new ListLinked(); result.head = head.next; return result; } } public ListLinked concatenate(ListLinked l) { if (isEmpty()) { return l; } else { return cons(first(), rest().concatenate(l)); } } public int printLength = 5; public int setPrintLength(int pl) { return printLength = pl; } public int getPrintLength() { return printLength; } public String toString() { String result; if (isEmpty()) { return "()"; } else { int i; Node n; result = "(" + head.content; for (n = head.next, i = 1; n != null || (printLength > 0 && i > printLength); n = n.next, i++) { result += " " + n.content; } if (printLength > 0 && i > printLength) result += "..."; result += ")"; return result; } } public static void main(String[] args) { ListLinked l = cons("A", cons("B", cons("C", null))); System.out.println(l); } } questi i metodi da implementare: public ListLinked reverse(); // Inverte una lista public ListLinked remove(String s); // Crea una nuova lista con 's' rimosso. public ListLinked oddList(); // Crea una nuova lista con solo gli elementi in posizione dispari. public ListLinked evenList(); // Crea una nuova lista con solo gli elementi in posizione pari. public int length(); // Riscrivere *senza* usare cicli; potete fare un overload. mi basta che me ne venga risolto / spiegato uno fra questi, poi dopo per gli altri ci penso io
__________________
L'EMPOLI NON SI DISCUTE... SI AMA
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 3577
|
in particolare il mio problema sta nel poter richiamare ciclicamente l'attributo next che è un oggetto della classe stessta, la quale è un attributo della altra classe.
tanto per farmi capire, a parole è difficile: (mi scuso per la qualità delle immagini ) ![]() dunque, mettiamo caso che io devo trovare il nodo che nell'attributo di tipo stringa val ha valore "ciao", e poi stampare a video il contenuto del nodo successivo(next), come posso fare?
__________________
L'EMPOLI NON SI DISCUTE... SI AMA
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 3577
|
Codice:
public ListLinked reverse(){
ListLinked k=new ListLinked();
Node n=new Node(null, head);
Vector<Node>v=new Vector<Node>(1);
if(head==null){
System.out.println("la lista è vuota!");
}else{
while(n.next!=null){
v.add(n.next);
v.setSize(v.size()+1);
n=n.next;
}
Node[]q=new Node[v.size()];
for(int i=0;i<v.size();i++){
q[i]=v.get(v.size()-i-1);
}
for(int i=0;i<v.size();i++){
q[i].next=q[i+1];
}
k.head=q[0];
}
return k;
}
__________________
L'EMPOLI NON SI DISCUTE... SI AMA
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Codice:
Node aux = head;
while(aux != null && !aux.val.equals("ciao") {
aux = aux.next;
}
if(aux != null && aux.next != null) {
System.out.println(aux.val);
}
Terminato il while ho 2 possibilità: 1) ho scorso tutta la lista e quindi non ho trovato nessun elemento il cui campo val è "ciao" (quindi aux = null) 2) ho trovato l'elemento il cui campo val è "ciao" e quindi aux punta a quello. in questo secondo caso allora devo controllare se l'elemento successivo ad aux è null, in caso contrario stampo il suo val. NB: tutti i controlli rispetto a null si devono fare altrimenti viene lanciata una NullPointerExceptio a runtime. NMB: non ci metto la mano sul fuoco....tra l'altro sono senza compilatore e non posso provare.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 3577
|
Quote:
MA questo esercizio l'avevo da poco capito anche io... ho dubbi sul reverse, per esempio, ma secondo te se riesco a farlo con i Vector, funziona la cosa? è giusta?
__________________
L'EMPOLI NON SI DISCUTE... SI AMA
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2005
Messaggi: 3577
|
che mi dite di iterator?
__________________
L'EMPOLI NON SI DISCUTE... SI AMA
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
mi deve essere sfuggita qualche cosa allora....!cmq per il reverse stavo pensando a semplici inserimenti e rimozioni. Mi spiego meglio. Non è necessario l'utilizzo di una struttura dati ausiliaria. Si può benissimo prendere il elemento della prima lista, rimuoverlo dalla prima ed inserirlo in testa ad una seconda (etc...), che è poi quella che devi restituire, no?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Nov 2006
Città: Monza
Messaggi: 70
|
Se ti serve ancora questo è il metodo Reverse funzionante:
public ListLinked reverse(){ // inverte una lista Node curr = head; if(curr == null) throw new NoSuchElementException(); if(curr.next == null) {return null;} Node temp = null; while (curr != null) { Node next = curr.next; curr.next = temp; temp = curr; curr = next; } head = temp; return null; }
__________________
Lµкє ™
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:20.













mi deve essere sfuggita qualche cosa allora....!








