0

编辑:我更新了线程以回答您的一些问题。这是一个编程作业。我的解决方案不起作用:要回答此线程上的评论,它应该按字母顺序找到最大的字符串。例如,“汤姆”比“安迪”大。

编写一个递归方法来查找单链表中的最大值。从类 LinkedList 继承并添加递归方法。您将需要使用迭代器来访问链表的每个节点。您可能需要添加一个辅助方法来启动递归。使用驱动程序类填充您的链接列表并证明您的方法有效。向驱动程序类添加额外的测试。提供的驱动程序类中最大的是汤姆。

提供的驱动程序类:

public class MyLinkedListDriver {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyLinkedList myLinkedList = new MyLinkedList();
    myLinkedList.add("Sarah");
    myLinkedList.add("Barbara");
    myLinkedList.add("Tom");
    myLinkedList.add("George");
    String largest = myLinkedList.findLargest();
    System.out.println(largest);
    System.out.println(myLinkedList.get(0));
}}

我的解决方案(不起作用):嗯,我得到空指针异常。

import java.util.Iterator;
import java.util.LinkedList;


public class MyLinkedList extends LinkedList<String> {

Iterator<String> it = super.iterator();
String largest=it.next();

public String findLargest(){
    if (it.hasNext()==false){
        return largest;
    }
    else{
        String temp = it.next();
        int x=largest.compareTo(temp);
        if(x>0){
            largest=temp;
        }
        findLargest();
    }
    return largest;
}}

有人可以告诉我我做错了什么吗?谢谢你。

4

3 回答 3

0

问题在于您初始化类的方式: MyLinkedList ..

你有 :

String largest=it.next();

在构造时,列表为空,因此it为空。因此it.next()为空;

于 2013-03-03T22:36:17.860 回答
0

这远非最佳解决方案,但此解决方案是通过修改您提供的代码。

import java.util.Iterator;
import java.util.LinkedList;

public class MyLinkedList extends LinkedList {

Iterator<String> it = null;
String largest="";

public String findLargest(){
    if (it == null) {
        it = super.iterator();
    }   

    if (it.hasNext()==false){
        it = null;
        return largest;
    }
    else{
        String temp = it.next();
        int x=largest.compareTo(temp);
        if(x<0){
            largest=temp;
        }
        findLargest();
    }
    return largest;
}}
于 2013-03-03T22:42:58.843 回答
0

抱歉,我看不出您的代码如何抛出 NullPointerException。

它应该抛出 NoSuchElementException ,因为您尝试在构造时获取迭代器的第一项,此时集合仍然为空。这显然是一个错误。

关于如何解决这个问题的提示:迭代器不应该是数据成员。它没有描述对象的状态。考虑将迭代器的新实例传递给辅助方法,该方法是递归的:

public String findLargest(){
    return findLargest(iterator());
}

private static String findLargest(Iterator<String> it) {
    // Think how you implement this part recursively WITHOUT using any data member
}
于 2013-03-03T22:47:19.290 回答