Класс узла в связанных списках, в частности, конструктор и использование его для создания связного списка случайных целых чисел - PullRequest
0 голосов
/ 17 ноября 2018

Конструктор моего узла выглядит так:

 public Node(int ndata, Node nlink)
         {
             this.data=ndata; 
             this.link = nlink; 
         }

Этот конструктор принимает два параметра: данные для узла и ссылку на следующий узел. Для всего, что я видел, что создает связанные списки, тем не менее, новый узел создается следующим образом:

Node nextNode = новый узел (данные);

Я не могу запустить программу, если по какой-то причине я не помещаю второй параметр в программу. Это код, который у меня есть.

public static Node ListGenerator()
{
    // Generate RANDOM List
    int j, cint, size;
    Scanner input = new Scanner(System.in); 
    System.out.println("Please enter the size"); 
    size = input.nextInt(); 
    //Node head; 
    Node current = null; 
    for (j = 1; j <= size; j++) {

        cint = (int)((Math.random() * 100)+1); 
        Node nextNode = new Node (cint,current.getLink()); 
        current = nextNode; 

    } return current;     

    // ...  
}

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

1 Ответ

0 голосов
/ 17 ноября 2018

В вашем коде нужно учесть несколько моментов:

  1. Вам понадобится переменная head в дополнение к current, чтобы в конечном итоге вернуться к вызывающей стороне (это было закомментировано, так что вы на правильном пути).

  2. Ваш первый вызов current.getLink() завершится сбоем, поскольку current начинается как null.

  3. Этот конструктор является нормальным для Node. Вы можете передать null во второй аргумент в качестве временного заполнителя для следующего узла, предполагая, что в вашем распоряжении есть установщик для использования позже. Вы можете перегрузить конструктор для поддержки link в качестве необязательного аргумента, но это не обязательно, если у вас нет доступа к редактированию класса.

  4. Добавление Scanner внутри ListGenerator излишне ограничивает его использование только пользовательским вводом. Эту логику ввода / вывода лучше всего разместить в вашем методе main (или в любой другой области вызова). Далее, в этом направлении, рассмотрите возможность передачи массива значений узлов и выведения случайных чисел из метода, а также дальнейшего увеличения модульности / возможности повторного использования.

  5. Имена методов в Java должны быть ниже camelCased.

  6. Объявления переменных в стиле ANSI C в верхней части метода, такие как int j, cint, size;, обычно не используются в Java; лучше всего объявить вашу индексную переменную внутри области видимости цикла.

Вот подход, который начинается в конце списка и работает вперед, используя два указателя на head и узел, следующий сразу за ним, next, что составляет null на первой итерации:

class Node {
    public int data;
    public Node link;

    public Node(int data, Node link) {
        this.data = data; 
        this.link = link; 
    }
}

class Main {
    public static Node listGenerator(int size) {
        Node next = null;
        Node head = null;

        for (int i = 1; i < size; i++) {
            head = new Node((int)(Math.random() * 100) + 1, next);
            next = head;
            head = null;
        }

        head = new Node((int)(Math.random() * 100) + 1, next);
        return head;     
    }

    public static void main(String[] args) {
        Node head = listGenerator(6);

        while (head != null) {
            System.out.print(head.data + "->");
            head = head.link;
        }

        System.out.println("null");
    }
}

Выход:

13->33->87->82->35->87->null

Попробуйте!

...