在Java中打印链表的元素

时间:2018-12-16 18:25:51

标签: java singly-linked-list

我正在尝试在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);**
        }
    }
}
}

3 个答案:

答案 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);
    }
}