Java 打印循环列表

Java 打印循环列表,java,data-structures,circular-list,Java,Data Structures,Circular List,我的任务是创建一个循环列表,我相信我的方法工作正常,除了打印方法 public String print() { String str = ""; Node curr = first; for(int i = 0; i < getSize(); curr = curr.getNext(), i++) { str += curr.getData(); } return str;

我的任务是创建一个循环列表,我相信我的方法工作正常,除了打印方法

    public String print() {
        String str = "";
        Node curr = first;

        for(int i = 0; i < getSize(); curr = curr.getNext(), i++) {
            str += curr.getData();
        }
        return str;
    }
编辑2:构造函数

class CircularList {
    private Node first;
    private int size;

    public CircularList() {
        first = null;
        size = 0;
    }
    ....
add方法的问题在于:该方法似乎将项目添加为列表中的第二个数字,而不是将其添加到其末尾。这不适用于初始条目,因为其头部和尾部相同

要解决此问题,请将节点的最后一个元素保留在循环列表中,并在最后一个元素而不是第一个元素进行插入。这使得删除最后一个元素变得更难管理,但您所获得的加速是值得的

如果你想给你的老师一个惊喜,你可以使用一个魔术:

public void add(int value) {
    if(first == null) {
        first = new Node(value, null);
        first.setNext(first);
    } else {
        // Remember the current first
        Node oldFirst = first;
        // Make a copy of the first node the "new first"
        first = new Node(first.getValue(), first.getNext());
        // Copy the new value into the "old first",
        // and make its next point to the "new first"
        oldFirst.setValue(value);
        oldFirst.setNext(first);
    }
    System.out.println("Added: " + value);
    size++;
}
确保你完全理解这个技巧。把它画在一张纸上以便更好地理解它。你的老师可能会问你这个问题,因为这并不常见

在打印过程中,不要使用+=,而是使用StringBuilder。您还可以通过观察当货币再次到达第一个位置时,您的打印应该结束来避免计数器:

add方法的问题在于:该方法似乎将项目添加为列表中的第二个数字,而不是将其添加到其末尾。这不适用于初始条目,因为其头部和尾部相同

要解决此问题,请将节点的最后一个元素保留在循环列表中,并在最后一个元素而不是第一个元素进行插入。这使得删除最后一个元素变得更难管理,但您所获得的加速是值得的

如果你想给你的老师一个惊喜,你可以使用一个魔术:

public void add(int value) {
    if(first == null) {
        first = new Node(value, null);
        first.setNext(first);
    } else {
        // Remember the current first
        Node oldFirst = first;
        // Make a copy of the first node the "new first"
        first = new Node(first.getValue(), first.getNext());
        // Copy the new value into the "old first",
        // and make its next point to the "new first"
        oldFirst.setValue(value);
        oldFirst.setNext(first);
    }
    System.out.println("Added: " + value);
    size++;
}
确保你完全理解这个技巧。把它画在一张纸上以便更好地理解它。你的老师可能会问你这个问题,因为这并不常见

在打印过程中,不要使用+=,而是使用StringBuilder。您还可以通过观察当货币再次到达第一个位置时,您的打印应该结束来避免计数器:


尝试调试时发现了什么?我们可以使用getNext实现和构造函数/添加元素方法吗?curr.getNext-您确定这是它应该做的吗?从您所描述的内容来看,curr.getNext似乎起到了curr.getPrevOfftopic的作用:不要将+=与字符串一起使用。使用StringBuilder。我建议您编写一个简单的单元测试,一次添加一个元素,并检查它是否按照您期望的顺序添加它们。当你发现一个最简单的例子却不能达到你的期望,我建议您在调试器中逐步检查代码,以便了解它在做什么。尝试调试时您发现了什么?我们可以使用getNext实现和构造函数/添加元素方法吗?curr.getNext-您确定这是它应该做的吗?从您所描述的内容来看,curr.getNext似乎起到了curr.getPrevOfftopic的作用:不要将+=与字符串一起使用。使用StringBuilder。我建议您编写一个简单的单元测试,一次添加一个元素,并检查它是否按照您期望的顺序添加它们。当您发现最简单的情况不能达到预期效果时,我建议您在调试器中单步执行代码,以便了解它在做什么。谢谢您,绘制一个图表肯定会有所帮助。是否有理由使用StringBuilder而不是+=?@user1327636在循环中避免+=的原因是,否则每次迭代都会创建一个新的String实例,而该实例会被丢弃。如果您正在打印{1,2,3,4},那么字符串1,1,2和1,2,3将被临时创建,然后丢弃--请记住Java字符串是不可变的,因此+=生成一个新对象。是指向详细讨论该问题的答案的链接。在您的add方法中,我们是否应该在else条件的末尾添加first=oldfirst。。。。因为它是一个类变量…@bapusethi不,绝对不是。你似乎误解了这个方法。我不怪你,这不是小事。请用纸和铅笔试一下,看看这是怎么回事。另外,你的编辑不正确,我拒绝了。谢谢你,画一个图表肯定有帮助。是否有理由使用StringBuilder而不是+=?@user1327636在循环中避免+=的原因是,否则每次迭代都会创建一个新的String实例,而该实例会被丢弃。如果您正在打印{1,2,3,4},那么字符串1,1,2和1,2,3将被临时创建,然后丢弃--请记住Java字符串是不可变的,因此+=生成一个新对象。是指向详细讨论该问题的答案的链接。在您的add方法中,我们是否应该在else条件的末尾添加first=oldfirst。。。。因为它是一个类变量…@bapusethi不,绝对不是。你似乎误解了这个方法。我不怪你,这不是小事。请用纸和铅笔试一下,看看这是怎么回事。另外,你的编辑不正确,我拒绝了。
public String print() {
    StringBuilder str = new StringBuilder();
    Node curr = first;
    while (true) {
        str.append(curr.getData());
        curr = curr.getNext();
        if (curr == first) break;
    }
    return str.toString();
}