2016-10-10 5 views
0

Ich implementiere eine abstrakte Klasse und implementiere eine insert Methode, die in eine sortierte Liste einfügt. Dies ist die rekursive Methode, die ich bisher habe:java - sortierte Liste rekursive Einfügemethode

public void insert(E data) { 
    Node<E> temp = head; 
    insert(temp, data); 
} 

private void insert(Node<E> curr, E data){ 
    Node<E> temp = new Node<E>(data); 
    if (head == null || data.compareTo(head.data) < 0) { 
     temp.next = head; 
     head = temp; 
    } 
    else if(curr.data.compareTo(data) < 0 && (curr.next == null || curr.next.data.compareTo(data) > 0)){ 
     temp.next = curr.next; 
     curr.next = temp; 
     return; 
    } 
    else{ 
     insert(curr.next, data); 
    } 
} 

jedoch jederzeit Ich versuche 2+ Elemente in die Liste einfügen, erhalte ich ein Null-Zeiger-Ausnahmefehler. Kann mir jemand meinen Fehler erklären? Dies ist, was passiert, wenn ich versuche, es zu laufen einfach 1 und 2 eingefügt: https://gyazo.com/d254d563675b9d1b0efbce443eda4445

Antwort

1

Er sagt, dass es eine Nullpointer an der Linie 53, die die else-if-Anweisung lautet:

else if(curr.data.compareTo(data) < 0 && curr.next.data.compareTo(data) > 0) 

Ich denke, es gibt diese Ausnahme, weil curr.next null ist. Wie ich sehen kann, wenn Sie das erste Element hinzufügen, initialisieren Sie head, aber head.next ist null (temp.next = head ist null, da head zu diesem Zeitpunkt null ist). Wenn Sie also versuchen, das zweite Element hinzuzufügen, können Sie nicht auf curr.next.data zugreifen und es gibt NullPointerException.

+0

Wie würde ich damit umgehen? – witcheR

+0

Ein einfacher Weg wäre, das else zu starten, wenn with (curr.data! = Null && curr.next! = Null). Die if-Bedingung wird falsch sein, sobald entweder null und fale bis zum letzten else ist. Aber das ist nicht das Hauptproblem. Das Hauptproblem ist der Ansatz, mit dem Sie versuchen, etwas zu managen, das besser mit anderen Mitteln gehandhabt werden kann, z. B. an die Liste anhängen und sie dann zum Beispiel einzigartig machen. –

+0

'else if (curr.data.compareTo (data) <0 && (curr.next == null || curr.next.data.compareTo (data)> 0)' könnte möglicherweise das Problem lösen wie im else-if Blockieren Sie möchten Daten hinzufügen, wenn curr> data> curr.next und curr.next = null bedeutet, dass data das kleinste Element ist – merterpam