Дайте некоторую ясность в реализации этого связного списка - PullRequest
0 голосов
/ 23 июня 2019

Я попытался реализовать односвязный список в Java, используя следующий код. Я написал код так, чтобы пользователь вводил столько цифр, сколько ему нужно, и, наконец, когда он нажимает клавишу ввода на клавиатуре, программа отображает все введенные цифры.

Например, если пользователь вводит что-то вроде 12345548963256987451236589745, а затем ввод должен выдать этот результат "12345548963256987451236589745".

Я знаю, что могу сделать это, просто используя String или BigInteger, но я просто хотел попробовать это со связанным списком.

    public static void main(String [] args)
    {
    Node start=null,end=null;
    Scanner in = new Scanner(System.in);
    char ch ;
    ch = in.next();
    while(ch.charAt(0)!='\n')
    {
        Node n = insert(ch-48);
        if(start==null)
        {
            start = n;
            end = n;
        }
        else
        {
            end.next=n;
            end = n;
        }
        ch  = in.next();
    }
    Node n = start;
    while(n!=null)
    {
        System.out.print(n.data);
        n=n.next;
    }
}
    private static Node insert(int i) {

      Node n = new Node();
      n.data=i;
      n.next = null;
      return n;
     }

По какой-то причине программа движется по бесконечному циклу. Я имею в виду, что он никогда не выйдет из входной части.

Мне кажется, я что-то напутал с этой строкой: ch.charAt (0)! = '\ п'

Так что я должен изменить?

Сначала я попробовал это на языке C и попытался имитировать то же самое в JAVA, это работало в C, но это доставляет проблемы в JAVA.

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

В этом примере нет необходимости использовать Scanner. Вы можете просто читать байты непосредственно из System.in (используя метод InputStream::read()) и останавливаться, как только получите нецифровый символ.

package misc;

import java.io.IOException;

public class Node {
    private int data;
    private Node next;

    public static void main(String[] args) throws IOException {
        Node start = null, end = null;
        int ch;
        while(Character.isDigit(ch = System.in.read())) { // or: while((ch = System.in.read()) != '\r') {
            Node n = insert(ch - 48);
            if (start == null) {
                start = n;
                end = n;
            } else {
                end.next = n;
                end = n;
            }
        }

        Node n = start;
        while (n != null) {
            System.out.print(n.data);
            n = n.next;
        }
    }

    private static Node insert(int i) {
        Node n = new Node();
        n.data = i;
        n.next = null;
        return n;
    }
}

Пример ввода: "12345"

Пример вывода: 12345

0 голосов
/ 23 июня 2019

Если вы действительно хотите использовать char по char, вы можете сделать что-то вроде ниже.

Обратите внимание, что in.next () будет использовать только символы, игнорирующие '/ n', поэтому вы должны использовать in.nextLine (), то в случае пустой строки (нажатой '/ n') длина строки равна нулю.

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        int iter = 0;
        while (iter < line.length()) {

            // Node logic

            iter++;
            if(iter == line.length()){
                iter = 0;
                line = in.nextLine();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...