Печать элементов связанного списка в Java - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь реализовать связанный список в 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 голосов
/ 16 декабря 2018

В своем выражении 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);
    }
}
0 голосов
/ 16 декабря 2018

У вас есть две ошибки.

(1) Вы добавляете первый элемент дважды.У вас есть

if(head==null){
    head=new Node(data);
} 

, но затем вы продолжаете и добавляете его снова.

(2) Когда вы распечатываете список, вы останавливаетесь, когда current.next == null - так что выОстанавливаемся перед тем, как добраться до последнего элемента.Условие в вашем while цикле должно быть

while(current != null) {

вместо проверки current.next.

0 голосов
/ 16 декабря 2018

Поменяйте местами эти 2 утверждения.Напечатайте данные, прежде чем перейти к следующему узлу:

System.out.println(current.data);
current=current.next;

и измените условие while с current.next!=null на while current!=null, поскольку current.next () будет нулевым для последнего узла и, следовательно,не будет напечатано

Также вы добавляете 1-й элемент дважды в вашем 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);}
}
...