#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’ может максимально выполнять рекурсию только один раз, создавая правильный связанный список.