Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Algorithm_Recursion - Fatal编程技术网

Java中使用递归查找双链表中的最小元素

Java中使用递归查找双链表中的最小元素,java,algorithm,recursion,Java,Algorithm,Recursion,类赋值要求我编写具有指定方法签名的方法: public static <T extends Comparable<T>> T findSmallest(DoubleLinkedListADT<T> list) publicstatict findsmalest(双链接列表) 方法必须返回列表中最小的元素,它必须递归,我不能修改方法签名,并且增长函数不能有大于n的大O(O(nlogn)是不可接受的) 以下是我到目前为止的情况: public static

类赋值要求我编写具有指定方法签名的方法:

 public static <T extends Comparable<T>> T findSmallest(DoubleLinkedListADT<T> list)
publicstatict findsmalest(双链接列表)
方法必须返回列表中最小的元素,它必须递归,我不能修改方法签名,并且增长函数不能有大于n的大O(O(nlogn)是不可接受的)

以下是我到目前为止的情况:

public static <T extends Comparable<T>> T findSmallest(DoubleLinkedListADT<T> list) {

    if(list.isEmpty()){
        return null;
    }
    ListIterator<T> lit = list.listIterator();
    T smallest = lit.next();

    return search(lit, smallest);
}

private static <T extends Comparable<T>> T search(ListIterator<T> lit, T smallest){

    if(lit.hasNext()){
        if(smallest.compareTo(lit.next())==1){
            smallest =  lit.previous();
            lit.next();
        }
        search(lit, smallest);
    }
    return smallest;
}
publicstatict findsmalest(双链接列表){
if(list.isEmpty()){
返回null;
}
ListIterator lit=list.ListIterator();
T最小=点亮。下一步();
返回搜索(亮,最小);
}
私有静态T搜索(ListIterator点亮,T最小){
if(lit.hasNext()){
if(最小的.compareTo(lit.next())==1){
最小的=lit.previous();
lit.next();
}
搜索(发光,最小);
}
返回最小;
}
(不要担心DoubleLinkedListDT,它是老师提供的接口。可以将DoubleLinkedList引用分配给DoubleLinkedListDT类型,它是它的子类型。)

这适用于空列表、单元素列表和双元素列表。任何更大的东西都会失败。我想我只是不太理解递归,因为搜索方法中的第一个return语句不是findsmalest类中搜索调用返回的语句,这让我感到困惑。它使用搜索中的最后一个返回调用,该调用使用的第一个最小对象引用是错误的最小对象引用


我不是在找一个只给我正确代码的人。我想弄清楚它为什么这么做。

好吧,你的代码很复杂,所有的双链接爬行看起来都很糟糕。 以下是我为INT列表提供的最优雅的解决方案:

public class Test {

    public static Integer min(Iterator<Integer> it) {
        if (it.hasNext()) {
            return Math.min(it.next(), min(it));
        }
        return Integer.MAX_VALUE;
    }

    public static void main(String[] args) {
        System.out.println(min(Arrays.asList(2, 3, 1, 4, 5).iterator()));
    }
}
公共类测试{
公共静态整数min(迭代器it){
if(it.hasNext()){
返回Math.min(it.next(),min(it));
}
返回Integer.MAX_值;
}
公共静态void main(字符串[]args){
System.out.println(min(Arrays.asList(2,3,1,4,5).iterator());
}
}

适应任何类型的列表都应该很容易。

放弃任何事情,包括做家庭作业和上大学,去尝试几个简单的递归函数来了解它们是如何工作的。FindSalest(list)=min(listHead,FindSalest(listTail))希望这个小提示能有所帮助:-)这是有意义的。非常感谢。我会看看我是否能让它为我工作。