两种标记的方法有什么区别?它们的输出是否相同?

What is the difference between the two marked methods? Are their outputs the same?

这段代码在我必须解决的练习中受到质疑。虽然我的代码显示了正确的结果(版本一),但我不确定它是否与提供的解决方案(版本二)一样好,或者它是否完全正确。任务是写一个class,代表一本书和使用自引用向前和向后翻页的方法。

public class Book {

    private int page;
    private Book nextPage;

    public Book(int page) {
        setPage(page);
        setNextPage(null);
    }

//Getter and Setter

    public void setPage(int page){
        this.page = page;   
    }

    public int getPage() {
        return this.page;
    }

    public void setNextPage(Book nextPage) {
        this.nextPage = nextPage;
    }

    public Book getNextPage() {
        return nextPage;
    }

/*The following methods are getting two int values and should page backward, showing each page number. */

版本一:

    public static void pageBackward1(int currentPage, int goalPage) {
        Book page = new Book(currentPage);
        System.out.print("Page " + page.getPage() + " ");
        while(goalPage != page.getPage()) {
            currentPage--;
            page.nextPage = new Book(currentPage);
            page = page.nextPage;
            System.out.print("Page " + page.getPage() + " ");
        }
    }

版本二:

    public static void pageBackward2(int currentPage, int goalPage) {
        Book previousPage = null;
        for(int i = currentPage; i <= goalPage; i++) {
            Book page = new Book(i);
            page.setNextPage(previousPage);
            previousPage = page;
        }
        Book page = previousPage;
        while(page != null) {
            System.out.print("Page " + page.getPage() + " ");
            page = page.getNextPage();
        }
        System.out.println();
     }
}

下面的demo-class很简单,展示了方法的执行:

public class BookDemo {

    public static void main(String[] args) {
        Book.pageBackward1(500, 455);
        System.out.println();
        Book.pageBackward2(500, 455);
    }
} 

如您所说,解决方案是等效的(字面意思!在相同的输入数据上,它们输出相同的数据,尽管通过标准输出而不是 return 值)。

我认为,由于提供的解决方案,练习的建议是 pre-fill/pre-generate Book,然后使用 getNextPage() getter 逐步完成它们。我相信你已经得出了相同的结论,因为你做了几乎相同的事情,但顺序不同,单步执行实例一次,但在创建它们时(而不是,例如,单步执行所有现有的 Books 在创建下一个之前到达最后一个)。

在我看来,由于这些不稳定的语义和不明确的目标,这个练习根本无法教授很多东西,而且对于学生来说,直接开始使用更明确命名和通用的数据会更有成效 linked list结构。