简体   繁体   English

链表的 Java 实现

[英]Java Implementation of a Linked List

I'm trying to implement a linked list in java consulting my school's textbook.我正在尝试在 Java 中实现一个链表,并参考我学校的教科书。

To vist the list I use the method getInfo() for each node that should return name and surname of every person in the list (I'm implementing a list of person).要查看列表,我对每个节点使用getInfo()方法,该方法应该返回列表中每个人的姓名(我正在实现一个人列表)。

I don't get why my textbook, in the method getInfo() of the class Node, returns a new Invitato(info) and not the one who is stored in the class Nodo .我不明白为什么我的教科书在 Node 类的getInfo()方法中返回一个new Invitato(info)而不是存储在Nodo类中的那个。

If I try to return the one who is stored in the class Nodo , I'm getting a null pointer exception.如果我尝试返回存储在类Nodo中的那个,我会收到一个空指针异常。

public class Main{
    public static void main(String args[]){
        
        Invitato i1 = new Invitato("Michele","Bianchi");
        Invitato i2 = new Invitato("Paolo","Rossi");
        Invitato i3 = new Invitato("Mario","Verdi");
        Invitato i4 = new Invitato("Giacomo","Neri");

        Lista l = new Lista();

        l.inserisciInCoda(i1);
        l.inserisciInTesta(i2);
        l.inserisciInTesta(i3);
        l.inserisciInPosizione(i4,2);

        l.visitaLista();
    }
}


public class Lista{
    private Nodo head;
    private int elementi;

    public Lista(){
        elementi=0;
        head = null;
    }

    private Nodo creaNodo(Invitato invitato, Nodo link){
        Nodo nuovoNodo = new Nodo(invitato);
        nuovoNodo.setLink(link);
        return nuovoNodo;
    }

    public int getElementi(){
        return elementi;
    }

    private Nodo getLinkPosizione(int n){
        Nodo p = head; 
        int i = 1;

        if(n>elementi || n<1)
            return null;
        else{
            while(p.getLink() != null && i<n){
                p = p.getLink();
                i++;
            }
        }
        return p;
    }

    public void visitaLista(){
        Nodo p = head;
        if(p==null){
            System.out.println("Lista vuota");
        }
        else{
            while(p!=null){
                System.out.println(p.getInfo().toString());
                p = p.getLink();
            }
        }
    }

public void inserisciInTesta(Invitato invitato){
        Nodo p = creaNodo(invitato, head);      //creo un nuovo nodo e lo liko alla testa
        head = p;                             //il nuovo nodo diventa la head
        elementi++;
    }

    public void inserisciInCoda(Invitato invitato){
        if(head==null){                             //se la lista è vuota
            inserisciInTesta(invitato);          //posso inserire il nuovo nodo in testa
        }

        else{
            Nodo p = getLinkPosizione(elementi);            //prendo l'ultimo nodo
            Nodo nuovoNodo = creaNodo(invitato, null);
            p.setLink(nuovoNodo);
            elementi++;
        }
    }

    public void inserisciInPosizione(Invitato invitato, int posizione){
        if(posizione <=1){
            inserisciInTesta(invitato);
        }
        else{
            if(posizione > elementi){
                inserisciInCoda(invitato);
            }
            else{
                Nodo p = getLinkPosizione(posizione-1);
                Nodo nuovoNodo = creaNodo(invitato,p.getLink());
                p.setLink(nuovoNodo);
                elementi++;
            }
        }
    }

    public void eliminaInTesta(){
        if(head == null)    //la lista è vuota?
            return;
        head = head.getLink(); //la nuova head è il nodo a cui linka, quindi ora head riferisce al secondo nodo
        elementi--;
    }

    public void eliminaInCoda(){
        if(head == null){               //lista vuota
            return;
        }
        Nodo p = getLinkPosizione(elementi-1);    //prendo il penultimo nodo
        p.setLink(null);                // e metto il suo link a null
        elementi--;
    }

    public void eliminaInPosizione(int n){
        if(n<=1){
            this.eliminaInTesta();
        }
        else{
            if(n>=elementi){
                this.eliminaInCoda();
            }
            else{
                Nodo pp = getLinkPosizione(n-1);         //nodo prima di quello da cancellare
                Nodo ps = getLinkPosizione(n);          //nodo da cancellare
                
               pp.setLink(ps.getLink());                //assegno al link precedente a quello da cancellare il link di quello che sto cancellando
               elementi--;
            }
        }
    }
}

public class Invitato{
    private String nome;
    private String cognome; 

    public Invitato(String nome, String cognome){
        this.nome = nome;
        this.cognome = cognome;
    }

    public Invitato(Invitato invitato){
        this.nome = invitato.getNome();
        this.cognome = invitato.getCognome();
    }

    public String getNome(){
        return nome;
    }

    public String getCognome(){
        return cognome; 
    }

    public String toString(){
        return nome + " " + cognome+";";
    }
}

public class Nodo{
    private Invitato info; 
    private Nodo link;

    public Nodo(Invitato invitato){
        this.invitato = new Invitato(invitato);
        link = null;
    }

    public Invitato getInfo(){
        return new Invitato(info);
    }

    public void setLink(Nodo link){
        this.link = link;
    }

    public Nodo getLink(){
        return link;
    }    
}

The constructor of Nodo is incorrect: Nodo的构造函数不正确:
this.invitato = new Invitato(invitato);
should be:应该:
this.info= new Invitato(invitato);

And you don't need to build a new instance of Invitato in Nodo's contructor and in getInfo method:并且您不需要在 Nodo 的构造getInfogetInfo方法中构建 Invitato 的新实例:

    public Nodo(Invitato invitato){
        this.info = invitato;
        link = null;
    }
    public Invitato getInfo(){
        return info;
    }

Once the constructor fixed, I've got a list without any exception:一旦构造函数修复,我就会得到一个列表,没有任何例外:

Mario Verdi;
Giacomo Neri;
Paolo Rossi;
Michele Bianchi;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM