Wiederholen Sie sich nicht (TROCKEN)
public void add(Object data) { Node temp = new Node(data); Node curr = head; if (head == null) { head = temp; } else { while (curr.getNext() != null) { curr = curr.getNext(); } curr.setNext(temp); } }
Sie haben ein size
Feld, deshalb sollten Sie es in dieser Funktion aktualisieren.
Eigentlich können Sie diese Funktion jedoch einfacher schreiben:
public void add(Object data) {
add(data, size);
}
Das reduziert Ihren duplizierten Code und vereinfacht die Wartung. Es beseitigt auch den Fehler, bei dem Sie die Größe nicht aktualisiert haben. Dies ist einer der Hauptgründe, warum doppelter Code schlecht ist: Es ist leicht, inkonsistente Ergebnisse zu erhalten.
Vertrauen Sie Ihrer Eingabe nicht
public void add(Object data, int index) { Node temp = new Node(data); Node curr = head; if (index == 0){ temp.setNext(head); this.head = temp; } else{ for(int i = 1; i < index; i++){ curr = curr.getNext(); } temp.setNext(curr.getNext()); curr.setNext(temp); } this.size++; }
Was passiert wenn index > size
? Sie werfen ein a, NullPointerException
wenn Sie versuchen, den null
Zeiger am Ende der Liste dereferenzieren . Das ist eher wenig informativ. Es gibt verschiedene Alternativen. Sie könnten die Liste mit leeren Knoten auffüllen, wenn dies der Fall ist, aber dies wäre ebenso wenig informativ, wenn dies unbeabsichtigt war. Sie könnten eine informativere Ausnahme auslösen:
if ( index > size ) {
throw new IllegalArgumentException("The index [" + index + "] is greater than the current size [" + size + "].");
}
Oder Sie könnten lautlos so tun, als wären index
sie gleich size
und machen weiter:
if ( index > size ) {
index = size;
}
Wenn das Hinzufügen am Ende der Liste üblich ist, haben Sie eine andere Alternative:
if ( null == tail ) {
tail = head;
}
} else if ( index >= size ) {
tail.setNext(temp);
tail = temp;
Dadurch wird eine neue tail
Variable hinzugefügt, die auf das Ende der Liste zeigt. Beachten Sie, dass Sie zusätzliche Änderungen vornehmen müssen, um die tail
Variable zu verwalten, wenn Sie auf diese Weise vorgehen. Wenn Sie a nicht beibehalten tail
, sollten Sie in Betracht ziehen, die Standardeinstellung vor der Liste hinzuzufügen . In einer verknüpften Liste ist das einfach, während das Hinzufügen am Ende schwierig ist, wenn die Liste einzeln verknüpft ist.
Sie müssen nicht this.
mit Feldnamen verwendet werden, es sei denn, Sie haben einen Namenskonflikt (z. B. einen Funktionsparameter). Du kannst es also einfach sagen
size++;
TROCKEN Teil II
Die Funktionen replace
und get
, und remove
sollten auch auf die Situation achten, in der index
sich die Liste außerhalb der Liste befindet. Für replace
und get
möchten Sie vielleicht eine find
Funktion definieren, die Sie gerne verwenden würden
Node current = find(index);
und als etwas definieren
private Node find(int index) {
if ( index >= size ) {
throw new IllegalArgumentException("The index [" + index + "] is greater than the current size [" + size + "].");
}
Node current = head;
for ( int i = 0; i < index; i++ ) {
current = current.getNext();
}
}
Beachten Sie, dass ich schreibe, current
anstatt es als abzukürzen curr
. Der Bruchteil der Sekunde, den er beim Lesen speichert, wiegt mehr als den Sekundenbruchteil auf, den die Eingabe benötigt. Nicht unbedingt heute, aber in sechs Monaten müssen Sie einen Moment daran denken, was curr
bedeutet. Und natürlich hat jeder, der es liest, es sofort herausgefunden. Nützlicher Code wird mehr gelesen als geschrieben, daher ist es sinnvoll, für den üblichen Fall zu optimieren.
StringBuilder
public String toString() { String list = ""; list += "[" + this.head.getData() + "]"; Node curr = head.getNext(); while (curr != null){ list += "[" + curr.getData() + "]"; curr = curr.getNext(); } return list; }
String
Verwenden Sie StringBuilder
anstelle von a die Verwendung von a . StringBuilder
ist zum Anhängen bestimmt. Regelmäßige String
Werte sind nicht. Die Verwendung +=
auf einem String
erstellt implizit String
jedes Mal ein Neues . Wenn Sie Glück haben, schreibt der Compiler StringBuilder
stattdessen Ihre Version um .
public String toString() {
StringBuilder builder = new StringBuilder();
Node current = head;
while ( current != null ) {
builder.append("[" + current.getData() + "]");
current = current.getNext();
}
return builder.toString();
}
Beachten Sie, dass dieser Code auch den Fall einer leeren Liste behandelt, was der ursprüngliche Code nicht tat (er würde einen auslösen, NullPointerException
wenn er mit einer leeren Liste aufgerufen wird, da er versuchen würde, die Null zu entreissen head
).