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();
}