打印圆形清单

时间:2013-05-31 15:21:55

标签: 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;
    }

我用数字测试它:{1,2,3,4,5},当我调用我的print方法时,结果得到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;
    }
    ....

1 个答案:

答案 0 :(得分: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();
}