在阅读这篇文章前,请务必阅读这三篇文章
定义列表
在函数式编程里,列表是递归定义的,即:
列表的第一个元素,称为head;
列表的剩余部分还是一个列表,称为tail;
正如你处理递归调用需要一个终止条件,列表也是如此,我们称这个终止情况为Nil,或者叫它空列表,它没有head和tail。因此,我们需要两种类来表示链表,一个表示非空链表(我们使用Cons来表示。借鉴了 Lisp家族中的cons操作),另一个表示空链表(Nil)。
例如,这有个链表,存储abcdef
基本实现如下:
public abstract class List {
public abstract T head();
public abstract List tail();
public abstract boolean isEmpty();
private List() {
}
private static class Nil extends List {
private Nil() {
}
@Override
public T head() {
throw new IllegalStateException("this is empty");
}
@Override
public List tail() {
throw new IllegalStateException("this is empty");
}
@Override
public boolean isEmpty() {
return true;
}
}
private static class Cons extends List {
private final T head;
pri