我不了解链表数据结构以及递归在其中的工作方式。我了解正常的递归,但根本没有链接列表。
下面的代码是带有A
元素的链接列表类。它的头部为A
元素,列表的其余部分(尾部)为另一个链接列表。
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class LL<A> {
private final A hd;
private final LL<A> tl;
public boolean isEmpty(){
return hd==null && tl==null;
}
public LL(A hd, LL<A> tl) {
this.hd = hd;
this.tl = tl;
}
public LL() {
this(null,null);
}
public int size() {
if (isEmpty())
return 0;
return 1 + tl.size();
}
public A get(int i) {
return i==0?hd:tl.get(i-1);
}
LL<A> drop(int i){
if(i==0) return this;
if(i<0) return new LL<>();
if(isEmpty()) return new LL<A>();
return this.tl.drop(i-1);
}
}
因此,例如,此drop方法使用第一个i
元素以外的元素创建一个新的链表。我不知道它是如何工作的。假设如果我在链接列表上调用drop(1)
,它将逐步执行什么操作?
答案 0 :(得分:0)
drop
仅在特殊情况下创建一个新列表。
如果列表包含n个元素,并且在i i
个元素的原始列表。
this.tl
是this
引用列表的尾部,换句话说this.tl
是您删除第一个元素后从this
获得的列表。 / p>
例如,假设列表中至少包含一个元素,则drop(1)
将返回this.tl.drop(0)
,后者将返回this.tl
-即原始列表中没有第一个元素。