Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中实现链表时遇到问题_Java_Data Structures_Singly Linked List - Fatal编程技术网

在java中实现链表时遇到问题

在java中实现链表时遇到问题,java,data-structures,singly-linked-list,Java,Data Structures,Singly Linked List,我尝试使用以下代码在java中实现链表: class Linkedlist<T>{ private node head, tail; public Linkedlist(){ head = new node(null); tail = head; } public boolean insert(T value){ if(head.getValue() == null){

我尝试使用以下代码在java中实现链表:

    class Linkedlist<T>{

    private node head, tail;

    public Linkedlist(){
        head = new node(null);
        tail = head;
    }

    public boolean insert(T value){
        if(head.getValue() == null){
            this.head.setValue(value);
            head.setNext(null);
            return true;
        }
        node insertNode = new node(value);
        tail.setNext(insertNode);
        tail = insertNode;
        return true;
    }
    public boolean insert(T value, int index)  {

        if ( sizeOfList() == index + 1 ) return false;
        node temp = this.head.getNext();
        node prvtmp = this.head;
        for (int i = 0; i <= index; i++) {
            temp = temp.getNext();
            prvtmp = temp;
            System.out.println("for loop");
        }
        node insertNode = new node(value);
        System.out.println("node created");
        prvtmp.setNext(insertNode);
        insertNode.setNext(temp);
        System.out.println("temps");
        return true;
    }
    public int sizeOfList(){

        int size = 0;
        node temp = this.head;
        while(temp.getNext() != null){
            temp = temp.getNext();
            size++;
        }
        return size;
    }
    public String[] rtrnList(){
        node temp = this.head;
        int listSize = sizeOfList();
        String[] resualt = new String[listSize + 1];
        for (int i = 0;i <= listSize;i++){
            resualt[i] = String.valueOf(temp.getValue());
            temp = temp.getNext();
        }
        return resualt;
    }
}
程序没有到达打印完成的行,但是如果我们删除该行:
list.insert(11,3)
然后程序就可以正常工作了

输出:

for loop
for loop
for loop
for loop
node created
finish insert

当您更新prvtm和temp的值时,问题在insert(T值,int索引)方法的for循环中。在您的代码中,您首先将temp的值设置为temp.getnext(),并且由于temp已更改,因此将prvtmp设置为temp将创建一个循环,这就是为什么当您尝试打印列表时,它在计算列表大小时进入无限循环的原因

只需将prvtmp=temp行放在temp=temp.getNext()之前,就像下面的代码片段一样。这将解决问题

public boolean insert(T value, int index)  { // 2 2 2 2 2 2

    if ( sizeOfList() == index + 1 ) return false;
    node temp = this.head.getNext();
    node prvtmp = this.head;
    for (int i = 0; i <= index; i++) {
        prvtmp = temp;
        temp = temp.getNext();
        System.out.println("for loop");
    }
    node insertNode = new node(value);
    System.out.println("node created");
    prvtmp.setNext(insertNode);
    insertNode.setNext(temp);
    System.out.println("temps");
    return true;
}
公共布尔插入(T值,int索引){//2 if(sizeOfList()==index+1)返回false; node temp=this.head.getNext(); 节点prvtmp=this.head;
for(int i=0;i在更新prvtm和temp的值时,问题在insert(T value,int index)方法的for循环中。在代码中,首先将temp的值设置为temp.getnext()由于temp已经更改,将prvtmp设置为temp将创建一个循环,这就是为什么当您尝试打印列表时,在计算列表大小时,它将进入一个无限循环

只需将prvtmp=temp行放在temp=temp.getNext()之前,就像下面的代码片段一样。这将解决问题

public boolean insert(T value, int index)  { // 2 2 2 2 2 2

    if ( sizeOfList() == index + 1 ) return false;
    node temp = this.head.getNext();
    node prvtmp = this.head;
    for (int i = 0; i <= index; i++) {
        prvtmp = temp;
        temp = temp.getNext();
        System.out.println("for loop");
    }
    node insertNode = new node(value);
    System.out.println("node created");
    prvtmp.setNext(insertNode);
    insertNode.setNext(temp);
    System.out.println("temps");
    return true;
}
公共布尔插入(T值,int索引){//2 if(sizeOfList()==index+1)返回false; node temp=this.head.getNext(); 节点prvtmp=this.head;
对于(int i=0;i,插入时有循环引用,您可以将此代码用于上述目的

public boolean insert(T value, int index)  {


    if(index > sizeOfList())
    {
        return false;
    }
    else if(index == sizeOfList())
    {
        if(insert(value))
            return true;
        else
            return false;
    }
    else
    {
        node previous = this.head;

        for (int i = 1; i <= index; i++) {
            if(i==index-1)
            {
                node newnode = new node(value);

                newnode.setNext(previous.getNext());
                previous.setNext(newnode);
                break;
            }
            previous = previous.getNext();

        }
    }

    return true;
}

当插入循环引用时,您可以将此代码用于上述目的

public boolean insert(T value, int index)  {


    if(index > sizeOfList())
    {
        return false;
    }
    else if(index == sizeOfList())
    {
        if(insert(value))
            return true;
        else
            return false;
    }
    else
    {
        node previous = this.head;

        for (int i = 1; i <= index; i++) {
            if(i==index-1)
            {
                node newnode = new node(value);

                newnode.setNext(previous.getNext());
                previous.setNext(newnode);
                break;
            }
            previous = previous.getNext();

        }
    }

    return true;
}

声明的insert方法只接受一个参数,如果要处理多个参数,则需要以其他方式重写此方法,或使用处理多个参数的不同签名将其重载。我重载insert方法我实际上有2个insert。如果您还可以发布程序的输出,这将非常有用。Y你有很多
System.out.println()
这可能有助于跟踪错误。好的,我将编辑postyour insert方法,正如声明的那样,只接受一个参数,如果您想处理多个参数,您需要以其他方式重写此方法,或者使用处理多个参数的不同签名重载它。我重载insert方法我实际上有2个insert。它如果你也能发布程序的输出,那会很有帮助。你有很多
System.out.println()
,可以帮助追踪错误。好的,我会编辑帖子。我很佩服你的编码技能。这对我很有帮助。我很佩服你的编码技能。这对我很有帮助
public boolean insert(T value, int index)  {


    if(index > sizeOfList())
    {
        return false;
    }
    else if(index == sizeOfList())
    {
        if(insert(value))
            return true;
        else
            return false;
    }
    else
    {
        node previous = this.head;

        for (int i = 1; i <= index; i++) {
            if(i==index-1)
            {
                node newnode = new node(value);

                newnode.setNext(previous.getNext());
                previous.setNext(newnode);
                break;
            }
            previous = previous.getNext();

        }
    }

    return true;
}
[2, 2, 11, 2, 2, 2, 2]