Передать объекты вспомогательным методам в Java

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

Это моя программа:

import java.io.*;
import java.util.*;


public class Solution {

    public class Link {
        Node head;

        public class Node {
            int data;
            Node next;
            Node(int x) {
                data = x;
                next = null;
            } 
        } // End of class Node

        public void printList() { 
            Node n = head; 
            while (n != null) { 
                System.out.print(n.data+" "); 
                n = n.next; 
            } 
        } 

        public void createList(String num) {
            this.head = new Node(num.charAt(0));
            Node prev = head ;
            for(int i = 1; i < num.length(); i++) {
                Node newNode = new Node(num.charAt(i));
                prev.next =  newNode;
                prev =  newNode;
            }
        }
    } // end of class Link

    public Node reverse(Node curr) {
        if (curr == null) return null;
        if (curr.next != null) {
            Node forward = reverse(curr->next);
            curr.next.next = curr ;
            curr.next = null;   
        } else {
            return res;
        }
        return forward;
    }    

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String number1 = sc.next();
        // System.out.println(number1);

        String number2 = sc.next();
        //System.out.println(number2);

        Link first = new Link();
        first.createList(number1);
        first.printList();

        System.out.println("''''''''''");
        Link second = new Link();
        second.createList(number1);
        second.printList();
        System.out.println("''''''''''");

        first.head = reverse(head); 
        first.printList();
        System.out.println("''''''''''");

        second.head = reverse(head);
        second.printList();
        System.out.println("''''''''''");
    }
}

Это ошибка, которую я получаю:

Solution.java:47: error: cannot find symbol
  public Node reverse(Node curr)
                      ^
  symbol:   class Node
  location: class Solution
Solution.java:47: error: cannot find symbol
  public Node reverse(Node curr)
         ^
  symbol:   class Node
  location: class Solution
2 errors

Мой вопрос заключается в том, что хотя и класс Link, и класс Node являются общедоступными, почему обратный метод не может получить доступ к символу Node? И как должны быть написаны вспомогательные методы на Java, чтобы они обращались к объектам любых классов.

Вам действительно нужен внутренний класс, содержащий внутренний-внутренний класс? Вы бы избавили себя от путаницы, если бы не вложили свои классы.

khelwood 19.03.2019 16:22

сделать внутренние классы static

Lino 19.03.2019 16:24

@Arnaud Я получил ошибку несовместимых типов: узел не является функциональным интерфейсом

Gopala Krishna 19.03.2019 16:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
345
1

Ответы 1

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

class Node {
    int data;
    Node next;

    Node(int x) {
        data = x;
        next = null;
    }
}

class Link {

    Node head;

    public void printList() {
        Node n = head;
        while (n != null) {
            System.out.print(n.data + " ");
            n = n.next;
        }
    }

    public void createList(String num) {

        this.head = new Node(num.charAt(0));
        Node prev = head;
        for (int i = 1; i < num.length(); i++) {
            Node newNode = new Node(num.charAt(i));
            prev.next = newNode;
            prev = newNode;
        }
    }
}

public class Solution {

    public Node reverse(Node curr) {
        // to be implemented
        return null;
    }
}

Решение не сработало. Я получил ошибку, что «Узел не является функциональным интерфейсом» внутри обратного метода

Gopala Krishna 19.03.2019 16:42

@GopalaKrishna У вашего обратного метода есть некоторые проблемы, вам нужно их исправить. Это не связано с тем, что классы не найдены.

Koray Tugay 19.03.2019 16:47

/Solution.java:57: ошибка: несовместимые типы: Node не является функциональным интерфейсом Node forward = reverse(curr->next); ^ /Solution.java:57: ошибка: переменная curr уже определена в методе reverse(Node) Node forward = reverse(curr->next); Я думаю, что это связано с тем, что метод не находит класс

Gopala Krishna 19.03.2019 16:48

@GopalaKrishna Да, я знаю. Вам нужно исправить этот метод.

Koray Tugay 19.03.2019 16:49

Другие вопросы по теме