链表排序方法在递归期间会给出StackOverFlow错误,并会比较列表中的元素

时间:2019-04-30 20:35:43

标签: java sorting recursion linked-list

我从头开始创建了链表,并添加了诸如 add 删除 set size 之类的方法等等。我还添加了一个简单的静态递归 sort 方法,该方法接受“链接列表”引用作为参数,以便可以在称为sort(linkedList);的Main类中使用,它返回一个排序的链表。

程序在Exception in thread "main" java.lang.StackOverflowErrorif (biggest.compareTo(nextNode.value) < 0) biggest = nextNode.value;行中抛出 return sort(list); 。我希望sort方法按字母顺序对列表进行排序(我的“链接列表”由String元素组成)。

这是代码中的方法:

 /**
     * The sort method sorts the list in alphabetical order
     * @param list list to be sorted
     * @return sorted linked list
     */
static DD_RecursiveLinkedList sort(DD_RecursiveLinkedList list) {
        DD_Node nextNode = head.next;
        String biggest = head.value, smallest = tail.value; //by default biggest is the head, and smallest is the tail
        if (isEmpty()) return null; //if list is empty, return null
        do { //find the biggest and smallest value in the list
            if (biggest.compareTo(nextNode.value) < 0) biggest = nextNode.value; //if nextNode is bigger than the biggest, biggest is nextNode
            if (smallest.compareTo(nextNode.value) > 0) smallest = nextNode.value; //if nextNode is smaller than the smallest, smallest is nextNode
            nextNode = nextNode.next; //update nextNode
        } while (nextNode!=null); //loop until nextNode is null

        set(0, biggest); set(size()-1, smallest); //set biggest as the head of the list, and smallest as the tail
//        remove(biggest);//remove the biggest (head) from the list
//        remove(smallest); //remove the smallest (tail) from the list
//        list.add(0, biggest); //add the biggest to the sorted list as head element
//        list.add(size()-1, smallest); //add the smallest to the sorted list as tail element
        return sort(list); //sort the order of sorted list recursively
    }

我已注释掉addremove行,因为它们包含在错误中,所以我使用了addremove方法,而不是setAUTH_USER_MODEL = 'your_app_name.User' 方法。 *clen = mlen + CRYPTO_ABYTES方法,用指定的元素替换指定索引处的元素。

1 个答案:

答案 0 :(得分:0)

这里的问题是,sort(list)方法将被无限次调用,从而导致Java堆栈溢出并且无法进一步在堆栈中存储任何变量。

return sort(list);

1. 因为没有限制说明应在什么条件下进行递归。停止。它将继续调用sort()。 -这会导致stackOverflow错误

2。由于remove()语句已注释。列表大小完全不变,因此也不会在isEmpty检查时停止。另外:无论您列出的是什么,bcoz最终总会返回null。