我有这个LinkedList,我在printList()模块中面临一个问题。
public class LinkedList {
LinkedList next;
int data;
public LinkedList(int data) {
this.data = data;
this.next = null;
}
public void append(int... data) {
int size = data.length;
for(int i=0; i<size; i++) {
append(data[i]);
}
}
public void append(int data) {
LinkedList head = this;
while(head.next!=null) {
head = head.next;
}
head.next = new LinkedList(data);
}
public void printList() {
LinkedList head = this;
StringBuffer sb = new StringBuffer();
do {
sb.append(head.data+", ");
head=head.next;
} while(head.next!=null);
System.out.println(sb.toString());
while(head.next!=null) {
sb.append(head.data+", ");
head=head.next;
}
System.out.println(sb.toString());
}
}
但是printList中的do和print一样打印。这是为什么?有人能帮我吗?
由于 杰文
答案 0 :(得分:1)
由于在第一个while循环head.next
为空之后,永远不会输入第二个while循环。
因此这段代码:
public void printList() {
LinkedList head = this;
StringBuffer sb = new StringBuffer();
do {
sb.append(head.data+", ");
head=head.next;
} while(head.next!=null);
System.out.println(sb.toString());
while(head.next!=null) {
sb.append(head.data+", ");
head=head.next;
}
System.out.println(sb.toString());
}
等同于此代码:
public void printList() {
LinkedList head = this;
StringBuffer sb = new StringBuffer();
do {
sb.append(head.data+", ");
head=head.next;
} while(head.next!=null);
System.out.println(sb.toString());
System.out.println(sb.toString());
}
即。您正在打印具有相同内容的相同StringBuffer
实例两次。
编辑:
如果您想要打印最后一个元素,请更改
while(head.next!=null)
到
while(head!=null)
答案 1 :(得分:1)
您的打印方法存在问题,如果是最后一个元素
head=head.next;
} while(head.next!=null);
head
将存储其引用,但由于它是最后一个元素,因此它后面没有下一个元素,这意味着条件head.next!=null
将在您能够追加{之前停止循环{1}}在此元素中。
您可以将方法重写为
data
对我来说更具可读性。
答案 2 :(得分:0)
我认为以上所有解决方案都很好,但我只是想给你一个像打印方法的列表: - )
public void printList() {
Node temp = this.next;
StringBuilder sb = new StringBuilder();
sb.append(data).append("-->");
while (temp != null) {
sb.append(temp.data).append("-->");
temp= temp.next;
}
sb.append("NULL");
return sb.toString();
}