我试图弄清楚如何在List构造函数中初始化当前对象列表,所以最初它不包含任何元素。如果我想使用单链表,我该怎么做?我知道这是关于列表的一个相当基本的问题哈哈。如果我想使用双链表,尾引用,循环链接或虚拟节点(如果它对所有这些都不太烦人的话)会有什么不同呢
public class List<T extends Comparable<T>> implements Iterable<T> {
private class Node<D extends Comparable<D>> {
private D data;
private Node<D> next;
}
答案 0 :(得分:2)
当链接列表发出信号列表的结尾时(基本上是空列表的情况),有两种思考方式。
第一个是将节点设置为null。之后,当您对列表执行操作(添加,删除,迭代)时,您可以在进一步检查之前检查它是否为空
第二个是使用一个特殊的对象(称为sentinel),它用作标志而不是null。这可能是一个特殊节点,当您从中获取数据时会抛出异常。优点是您不需要在所有方法中管理空值,但可能需要管理异常。
如果是双链表,它完全相同,只有节点内容发生变化(你有一个后加指针)
如果是尾部引用,则在列表类中添加一个指针,在列表尾部保留引用,因此将其作为头指针进行管理,它最初为null或带有标志对象,并且当第一个对象被添加到列表中,两个引用都将在同一节点上更新。
如果是圆形列表,它在初始化时仍然保持不变,那么当你添加第一个对象时,你可以同时将它自己链接到它。
例如:
public class List<T extends Comparable<T>> implements Iterable<T> {
private class Node<D extends Comparable<D>> {
private D data;
private Node<D> next;
}
Node firstNode;
public List(){
firstNode=null;
}
// other methods
}