我正在做我的作业,即创建循环列表,我相信我的方法工作正常,除了我的打印方法。
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;
}
....
答案 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();
}