2010-12-09 11 views
2

Wir wurden gebeten, ein Linked Set in Java zu implementieren. Unten ist mein Versuch, es hat alle Methoden, die wir schreiben müssen, aber die Methode remove ruft eine Null-Zeiger-Ausnahme ohne Fehler auf. Versuchen Sie, wie ich könnte ich kann nicht scheinen, es herauszufinden, jede Hilfe sehr geschätzt.LinkedSet Implementierung 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

Wissen Sie, in welche Zeile der NullPointer geworfen wurde? –

+1

Verwenden Sie, was die NPE Ihnen zu sagen versucht - schauen Sie durch die Stapelverfolgung und sehen Sie, welche Zeile die NPE wirft? Überlegen Sie sich nun, welche Variablen oder Rückgabewerte null sein könnten. –

+1

Es kann Ihr Problem nicht lösen, aber '{' und '}' für Ihre 'if'- und' while'-Anweisungen würden dies lesbarer machen. –

Antwort

5

Der offensichtliche Punkt ist, dass das erste Element in der Liste kein vorheriges Element hat. (Einige verknüpfte Liste Implementierungen eine Dummy-Link hinzufügen diese sauberer zu handhaben.)

+0

Hah, danke Kumpel, so richtig und so einfach –

1

Blick auf diesen Teil des Codes:

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; 

    } 

Wenn equals(t, head.item), dann pPrev == null, wenn Sie die while-Schleife verlassen und Sie‘ Ich bekomme später eine Nullzeiger-Ausnahme.