2010-12-09 39 views
2

Nous avons été invités à implémenter un ensemble lié dans Java. Voici ma tentative, il a toutes les méthodes qu'on nous demande d'écrire, mais la méthode remove appelle une exception de pointeur nul sans échec. Essayer comme je pourrais ne pas sembler comprendre, n'importe quelle aide très appréciée.Implémentation LinkedSet java

import java.util.*; 

class LinkedSet<T> { 

private static class Node<T> { 

    private T item; 
    private Node<T> next; 

    Node(T item, Node<T> next) { 

    this.item = item; 
    this.next = next; 
    } 

} 


private Node<T> head = null; 
private int numItems = 0; 

int size() { 

    return (numItems); 

} 

public boolean add(T t) { 

    if(contains(t)) return false; 

    Node<T> newNode = new Node(t, null); //new node to be added 

    if(numItems==0) { 

    head = newNode; 
    numItems++; 
    return true; 
    } 

    Node<T> temp = head; 

    while(temp.next != null) temp = temp.next; 
    temp.next = newNode; 
    numItems++; 
    return true; 

} 


public boolean remove(T t) { 

    if(numItems == 0) return false; //check for empty set 
    //was tempted to use contains here but would have made it N^2 I think 

    Node<T> p = head; //t if present 
    Node<T> pPrev = null; //previous node to p 

    while(p!=null && !equals(t, p.item)) { 

    pPrev = p; 
    p = p.next; 

    } 

    //t is present if node p!= null , node p != null ==> t in node p 

    if(p==null) return false; 
    else { 

    pPrev.next = p.next; //null pointer 
    numItems--; 
    return true; 
    } 


} 

public boolean contains(T t) { 


    Node<T> temp = head; 

    for(int i = 0; i < numItems; i++) { 

    if(equals(temp.item, t)) return true; 
    temp = temp.next; 
    } 

    return false; 

} 

private boolean equals(T t1, T t2) { //t1, t2 may be null 

    if(t1!=null) return t1.equals(t2); //learn this 
    else return t2 == null; //learn this 

} 

public static void main(String[] args) { 

    LinkedSet<Integer> test = new LinkedSet<Integer>(); 

    test.add(1); 
    test.add(2); 
    test.add(3); 

    for(int i = 0; i < 10; i ++) { 

    System.out.println("Testing i = " + i + " - " + test.contains(i)); 
    } 

    System.out.println(); System.out.println(); System.out.println(); 

    System.out.println(test.remove(1)); 


} 



} 
+1

Savez-vous à quelle ligne le NullPointer a été lancé? –

+1

Utilisez ce que le NPE essaie de vous dire - regardez à travers la trace de la pile et voyez quelle ligne lance le NPE? Considérons maintenant quelles variables ou valeurs de retour pourraient être nulles. –

+1

Cela ne résout peut-être pas votre problème, mais '{' et '}' pour vos instructions 'if' et' while' rendraient cette opération plus lisible. –

Répondre

5

Le point évident est que le premier élément de la liste n'a pas d'élément précédent. (Certaines implémentations de liste chaînée ajoutera un lien factice pour gérer cette plus propre.)

+0

Hah, merci mon pote, si juste et si simple –

1

Regardez cette partie du code:

Node<T> p = head; //t if present 
    Node<T> pPrev = null; //previous node to p 

    while(p!=null && !equals(t, p.item)) { 

    pPrev = p; 
    p = p.next; 

    } 

Si equals(t, head.item), puis pPrev == null lorsque vous quittez la boucle while et vous ll obtiendra une exception de pointeur null plus tard.