Java 不使用标准库创建链表的子列表

Java 不使用标准库创建链表的子列表,java,linked-list,sublist,Java,Linked List,Sublist,我试图弄清楚如何创建链表的子列表,而不使用标准库进行练习 我有一个解决方案编码,但我不确定这是否工作正常。我没有任何即将出现的编译错误,但如果有更好的方法来做这件事,或者是否应该进行更正,我希望得到第二个意见 LinkedList类基本实例变量 public class LinkedList<E> implements DynamicList<E> { LLNode<E> head; LLNode<E> tail; int

我试图弄清楚如何创建链表的子列表,而不使用标准库进行练习

我有一个解决方案编码,但我不确定这是否工作正常。我没有任何即将出现的编译错误,但如果有更好的方法来做这件事,或者是否应该进行更正,我希望得到第二个意见

LinkedList类基本实例变量

public class LinkedList<E> implements DynamicList<E> {

    LLNode<E> head;
    LLNode<E> tail;
    int llSize;



    LinkedList(){
        this.head = null;
        this.tail = null;
        this.llSize =0;
    } 

公共类LinkedList实现DynamicList{
淋巴结头;
淋巴结尾;
int-llSize;
LinkedList(){
this.head=null;
this.tail=null;
此.llSize=0;
} 
获取寻址LinkedList索引的方法

@Override
    public E get(int index) {
        LLNode<E> current = this.head;
        while(current.nextPointer != null){
            if(index == current.getIndex()){
                return current.getObj();
            }else{
                current = current.nextPointer;
            }
        }
        return null;
    }
@覆盖
公共E-get(int索引){
LLNode current=this.head;
while(current.nextPointer!=null){
if(index==current.getIndex()){
返回当前值。getObj();
}否则{
当前=当前.nextPointer;
}
}
返回null;
}
节点类

public class LLNode<E>{
    E obj;
    LLNode<E> previousPointer;
    LLNode<E> nextPointer;
    int index;

    public LLNode(E obj){
        this.obj = obj;
        this.index=0;
    }

    public E getObj() {
        return obj;
    }

    public LLNode<E> getPreviousPointer() {
        return previousPointer;
    }

    public LLNode<E> getNextPointer() {
        return nextPointer;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}
公共类LLNode{
E obj;
LLNode-previous指针;
LLNode-nextPointer;
整数指数;
公共LLNode(E obj){
this.obj=obj;
该指数=0;
}
公共E getObj(){
返回obj;
}
公共LLNode getPreviousPointer(){
返回先前的指针;
}
公共LLNode getNextPointer(){
返回下一个点;
}
public int getIndex(){
收益指数;
}
公共void集合索引(int索引){
这个指数=指数;
}
}
子列表法

@Override
    public DynamicList<E> subList(int start, int stop) {
        DynamicList<E> newDynamicList = new LinkedList<>();
        for(int i = start; i<stop; i++){
            newDynamicList.add(get(i));
        }


        return newDynamicList;
    }
@覆盖
公共DynamicList子列表(整数开始、整数停止){
DynamicList newDynamicList=新链接列表();

对于(int i=start;i,正如我所看到的,这是一个双链接列表。正如注释中所建议的,避免使用索引作为节点本身的一部分,索引是列表的一部分,因为列表控制每个节点执行任何操作(添加、删除、查找等)的遍历方式

我的建议(对于子列表):

  • 检查子列表是否在列表大小范围内(您可以抛出一些异常或返回一些默认数据,这取决于您的设计)
  • 将索引控件移动到列表中
  • 要获取子列表,您可能需要获取子列表的开始节点,然后使用
    nextPointer
    遍历下一个节点。您可以计算子列表的大小,并使用它来控制何时必须停止
publicdynamiclist子列表(int-start,int-stop){
DynamicList newDynamicList=新链接列表();
//在这里,您可以验证子列表条件是否有效(大小、边界等)
//如果参数不符合某些条件,则可能引发异常
int subListSize=停止-启动;
LLNode current=get(开始);
while(newDynamicList.size()
不使用
get
方法检索每个节点的主要原因是
get
操作每次调用时都从开始搜索节点。最好获取开始节点并从那里开始遍历节点


不要忘记,创建的子列表将包含对原始列表节点的引用。我建议克隆元素以避免影响原始节点

是否确实要将索引保留在节点对象中?我希望索引是列表中的节点位置,因此绑定到位置而不是元素。另外,请给出n此代码所有索引都将为0,导致子列表仅输出空列表,除非调用方法手动为每个节点分配索引。在一个节点中使用索引的问题是,您无法在另一个(子)列表中重用该节点:同一个节点将需要有两个不同的索引(每个列表对应一个索引)。另一个问题是子列表中的head&tail节点:head在子列表中不应该有previousPointer,但除非该节点在源列表中也是head,否则它应该有previousPointer。tail节点的情况类似。简言之,您需要为子列表创建新节点…您不能重用这些节点。感谢pointi在节点对象中查找索引的相关信息。谢谢,这是不可行的原因。@Anton然后使用add和addFirst以及addLast方法更新索引,并使用循环。我不确定如何将LinkedList中创建的每个节点的索引/位置值关联起来,而不将其绑定到相应的节点对象。如果我没有在LinkedList类中取消索引/位置实例变量如何为每个节点拥有一个唯一的索引/位置值?感谢您的反馈。但我不确定如何进行节点克隆。我将看看是否可以找到一些关于它的文档。