[英]Adding an element to a singly linked list in Java
我正在用Java實現一個單鏈表。 我對這段代碼if (head.next == null)
是,每次添加元素時都需要檢查if (head.next == null)
。 但是,添加第一個元素時,該條件僅滿足一次。
沒有這種條件,有沒有辦法實現單鏈接的非循環列表?
package sample;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class SinglyLinkedList<T> implements Iterable<T> {
private Node<T> head = new Node<T>(null);
private Node<T> last = null;
public SinglyLinkedList(T... elements) {
addAll(elements);
}
public void add(T element) {
if (head.next == null) {
head.next = new Node<T>(element);
last = head.next;
} else {
Node<T> newNode = new Node<T>(element);
last.next = newNode;
last = last.next;
}
}
public void addAll(T... elements) {
for (T element : elements) {
add(element);
}
}
@Override
public String toString() {
Iterator<T> iterator = iterator();
if (!iterator.hasNext()) {
return "[]";
}
StringBuilder builder = new StringBuilder();
builder.append("[");
while (iterator.hasNext()) {
T element = iterator.next();
builder.append(element);
if (!iterator.hasNext()) {
return builder.append("]").toString();
}
builder.append(", ");
}
return builder.toString();
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
Node<T> current = head;
@Override
public boolean hasNext() {
return current.next != null;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
Node<T> temp = current;
current = current.next;
return temp.next.element;
}
};
}
private static class Node<T> {
private Node<T> next;
private T element;
Node(T element) {
this.element = element;
}
@Override
public String toString() {
return element.toString();
}
}
}
在許多情況下,“良好的OO設計”使您無需進行if / else檢查。 最常見的是使用某種形式的多態性。
含義:您可以確保客戶端代碼可以簡單地在其他對象上調用方法,而不是向某個對象詢問某些屬性,然后再在客戶端代碼中對該屬性做出決定。 然后,在最初生成該“另一個對象”並將其提供給您的客戶代碼的代碼中,“隱藏”了“ if”。 (您會在這些視頻中找到一些不錯的示例)。
但是-我認為在這種情況下,這顯然是過大的!
關鍵是:從可讀性的角度來看,一次檢查確實沒有任何傷害(您可以將事情重構為更多的方法)。 性能……也沒關系。 如果經常調用您的代碼,而這很重要,那么無論如何JIT都會啟動,並且可能會創建在大多數情況下直接采用正確分支的代碼。
因此:這是一個不錯的實現; 而且我認為您不應該為此擔心而已!
您可以將last初始化為指向head,然后if是否多余:
private Node<T> head = new Node<T>(null);
private Node<T> last = head;
public void add(T element) {
Node<T> newNode = new Node<T>(element);
last.next = newNode;
last = last.next;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.