1

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

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

        for(int i = 0; i < getSize(); curr = curr.getNext(), i++) {
            str += curr.getData();
        }
        return str;
    }

我用数字测试它:{1,2,3,4,5},当我调用我的打印方法时,我得到 15432 作为结果。有谁知道这可能有什么问题,显然我没有看到它。另外,如果您需要更多代码,请告诉我。

编辑:经过一些评论后,我意识到这不是我的打印方法,这是我的 add() 和 getData() 方法:

    public void add(int value) {
        if(first == null) {
            first = new Node(value, null);
            first.setNext(first);
        } else {
            Node newNode = new Node(value, first.getNext());
            first.setNext(newNode);
        }
        System.out.println("Added: " + value);
        size++;
    }

    public int getData() {
        return first.getData();
    }

编辑2:构造函数;

class CircularList {
    private Node first;
    private int size;

    public CircularList() {
        first = null;
        size = 0;
    }
    ....
4

1 回答 1

4

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

要解决此问题,请将Node last元素保留在 中CircularList,并在 中进行插入,而last不是在first元素中。这使得删除最后一个元素有点难以管理,但是您获得的加速是值得的。

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

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而是使用。您还可以通过观察您的打印应该在再次curr到达时结束来避免计数器first

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();
}
于 2013-05-31T15:27:55.413 回答