Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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_Recursion_Stack Overflow - Fatal编程技术网

Java-创建订单链接列表,但不知道如何得到无限递归

Java-创建订单链接列表,但不知道如何得到无限递归,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,当我运行代码时,我得到了一个股票溢出错误,我不知道问题是什么。有人能帮我弄清楚吗 下面是给出错误的方法。我很确定这与我递归插入节点的方式有关,但我不知道我做错了什么 此方法的目的是在节点链接中找到正确的位置,并在那里插入新项。节点需要保持升序值。我希望这有助于更好地解释目的。谢谢 public class OrderedList< T extends Comparable<T> > { private ListNode<T> firstNode;

当我运行代码时,我得到了一个股票溢出错误,我不知道问题是什么。有人能帮我弄清楚吗

下面是给出错误的方法。我很确定这与我递归插入节点的方式有关,但我不知道我做错了什么

此方法的目的是在节点链接中找到正确的位置,并在那里插入新项。节点需要保持升序值。我希望这有助于更好地解释目的。谢谢

public class OrderedList< T extends Comparable<T> > {

    private ListNode<T> firstNode;
    private ListNode<T> lastNode;
    private String name; // the name is used in printing

    // constructor creates an empty ordered list with "ordered list" as the name
    public OrderedList() {   
        this( "ordered list" );    
    }

    // constructor creates an empty ordered list with a name
    public OrderedList( String listName ) {        
        name = listName;
        firstNode = lastNode = null;    
    }

    // insert an item into the right position of the ordered list
    public void insert( T insertItem ) {       
        if (isEmpty()) {           
            firstNode = lastNode = new ListNode<T>(insertItem);           
        }else {               
            if (insertItem.compareTo(firstNode.getData()) <= 0) {               
                firstNode = new ListNode<T>(insertItem, firstNode);               
            }else {                
                if (firstNode.equals(lastNode)) {                    
                    lastNode = new ListNode<T>(insertItem);                   
                }else {
                    T store = firstNode.getData();
                    firstNode = firstNode.getNext();                   
                    insert(insertItem);                    
                    firstNode.setNext(firstNode);
                    firstNode.setData(store);
                }
            }           
        }
    }

    public boolean isEmpty() {
        return firstNode == null;
    }
}
在最后一个else块中,再次调用insert。这是一个递归函数,递归函数原则上容易发生堆栈溢出

如果您放入一些println语句和一个计数器(每一步递增),您就可以看到发生了什么

else {    
            T store = firstNode.getData ();    
            firstNode = firstNode.getNext ();    
            System.out.println ("depth: " + ++depth);
            insert (insertItem);    
            --depth
            firstNode.setNext (firstNode);
            firstNode.setData (store);    
        }

深度是一个用于调试的属性或静态变量。

您没有提供足够的信息来确定它为什么在不触发任何退出条件的情况下无法继续调用insert。i、 什么是isEmpty,什么是firstNode。我看不到一个基本情况,它既不丢失整个列表,也不有效地利用第一个/最后一个引用。有人会认为,如果你有最后一份推荐信,插入的内容只适用于那里……不过我不会否决这个问题;你应该尝试解决问题,包括你试图解决的问题。