我正在尝试在Java中实现链接列表。在我的主类中,我从用户那里得到一些整数,并将它们放在链表中,然后打印出链表元素。到目前为止,一切工作正常,但是我认为在我的主类中,首先打印出每个元素的数据然后移至下一个元素是有意义的。当我这样做时,它不会打印列表的最后一个元素,但会打印两次第一个元素。我决定先移至下一个元素,然后再打印上一个元素的数据,效果很好!!!谁能解释为什么?(查看我的代码的最后两行)。
public class Node {
Node next;
int data;
public Node(int data){
this.data=data;
}
}
我的链表类:
public class LinkedList {
Node head;
public void append(int data){
if(head==null){
head=new Node(data);
}
Node current;
current=head;
while(current.next!=null){
current=current.next;
}
current.next=new Node(data);
}
}
我的主班:
public class Main {
static LinkedList linkedList =new LinkedList();
public static void main(String [] args){
System.out.println("please enter numbers you wanna store in a linked list");
Scanner scanner=new Scanner(System.in);
while (scanner.hasNextInt()){
linkedList.append(scanner.nextInt());
}
if (linkedList.head!=null){
Node current;
current=linkedList.head;
while (current.next!=null){
**current=current.next;
System.out.println(current.data);**
}
}
}
}
答案 0 :(得分:3)
交换这2条语句。在继续下一个节点之前先打印数据:
System.out.println(current.data);
current=current.next;
并将while条件从current.next!=null
更改为while current!=null
,因为current.next()对于最后一个Node将为null,因此将不打印
还要在append
方法中两次添加第一个元素。更改为以下:
public void append(int data){
if(head==null){
head=new Node(data);
}
else{
Node current;
current=head;
while(current.next!=null){
current=current.next;
}
current.next=new Node(data);}
}
答案 1 :(得分:3)
您有两个错误。
(1)您将两次添加第一个元素。您已经
if(head==null){
head=new Node(data);
}
但是您继续并再次添加它。
(2)打印列表时,您将在current.next == null
时停止-因此,您将在到达最后一个元素之前停止。 while
循环中的条件必须为
while(current != null) {
而不是检查current.next
。
答案 2 :(得分:2)
在您的append
语句中,将第一个元素添加两次:
public void append(int data){
if(head==null){
head=new Node(data); // <--- Added here
}
Node current;
current=head;
while(current.next!=null){
current=current.next;
}
current.next=new Node(data); // <--- And then again here
}
因此,您的链表实际上包含第一个元素两次。此后不会发生,因为该列表已经存在。
您应在return
之后添加head = new Node(data)
,或使用else语句:
public void append(int data){
if(head==null){
head=new Node(data);
} else {
Node current;
current=head;
while(current.next!=null){
current=current.next;
}
current.next=new Node(data);
}
}