【发布时间】:2016-10-08 19:04:59
【问题描述】:
我正在用 Java 实现一个单链表。我不喜欢这段代码的地方是我每次添加元素时都需要检查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();
}
}
}
【问题讨论】:
-
为什么需要
last对象? -
@MarounMaroun,因为我需要将元素附加到列表中。其实
add这个方法应该叫addLast -
@MarounMaroun,你认为
last是多余的吗?我看到了一些示例,它们只有头指针并遍历列表以将项目添加到末尾。因此,添加需要 O(n),而插入单链表需要 O(1)。另见bigocheatsheet.com
标签: java data-structures singly-linked-list