Печать целых чисел из самостоятельного связанного списка

#java #linked-list #singly-linked-list

#java #связанный список #single-linked-list

Вопрос:

Ниже приведен пример тестового вопроса, на который я полностью запутался и понятия не имею, как ответить.

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

Мой вопрос:

У меня есть следующий (рабочий) код, но соответствует ли это определение требованиям для приведенного выше вопроса? И если да, как бы я использовал его для печати целых чисел. Если нет, что мне нужно добавить, чтобы заменить, чтобы заставить его работать?

 public class Node {
    String value;
    Node next;

    public Node(String s) {
        this.value = s;
        next = null;
    }

    public Node(String s, Node n) {
        this.value = s;
        this.next = n;
    }

    public void setValue(String newValue) { //setters
        this.value = newValue;
    }
    public void setNext(Node newNext) {
        this.next = newNext;
    }

    public String getValue() { // getters
        return this.value;
    }
    public Node getNext() {
        return this.next;
    }
}
 

Комментарии:

1. ну, он ничего не печатает, не читает файл и не реализует связанный список, поэтому он не выполняет назначение, но, вероятно, его можно использовать как его часть.

Ответ №1:

 import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.File;

class Main {

    public static void main(String args[]) throws Exception {
        LinkedList ll = new LinkedList();
        Scanner sc = new Scanner(new File("yourFile.txt"));
        int i = 0;
        while (sc.hasNextInt()) {
            ll.drive(sc.nextInt());
            i  ;// Number of integers
        }
        ll.printing(i);
    }
}

class LinkedList {

    static int arr[];
    Node head;
    static Node ahead = null;// This node has all the nodes merged(see drive() function) forming a linked list.
    
    static class Node {

        int data;
        Node next;
    }

    static Node newNode(int data) {
        Node nn = new Node();
        nn.data = data;
        nn.next = null;
        return nn;
    }

    static Node insertEnd(Node head, int data) {
        if (head == null) {
            return newNode(data);
        } else {
            head.next = insertEnd(head.next, data);
        }
        return head;
    }

    public static void drive(int arg) {
        ahead = insertEnd(ahead, arg);
    }

    static void printing(int i) {
        if (ahead == null) {
            return;
        }
        //Storing in reverse
        arr = new int[i];

        for (int j = i - 1; j >= 0; j--, ahead = ahead.next) {
            arr[j] = ahead.data;
        }

        //Printing in reverse
        for (int j = 0; j < i; j  ) {
            System.out.println(arr[j]);
        }
    }
}
 

Комментарии:

1. большое спасибо, я просто хотел спросить, какова цель метода drive?

2. Функция drive непрерывно вызывается из функции main (цикл while) для каждого целого числа. функция drive используется для непрерывного добавления новых узлов к существующему узлу, который использует метод ‘insertEnd’. Поэтому, когда ‘ahead’ всегда имеет значение null при передаче параметра, каждый раз новый узел добавляется как head==null . Итак, здесь ‘insertEnd’ может максимально выполнять рекурсию только один раз, создавая правильный связанный список.