Я реализую связанный список в java, но мой код не выдает ошибок и не выводит - PullRequest
1 голос
/ 01 февраля 2020

Я реализую связанный список в java, но мой код не выдает ошибок и не выводит никаких данных.

class LinkedList25
{
    Node head;
    class Node
    {
        int data;
        Node next;
        Node(int value)
        {
            data = value;
            next = null;
        }
    }
    public static void main(String args[])
    {
        LinkedList25 list = new LinkedList25();
        boolean choice = true;
        list.insertNode(1,list.head);
        list.insertNode(2,list.head);
        list.insertNode(3,list.head);
        list.printList(list.head);
    }
    public void insertNode(int value,Node move)
    {
        Node temp = new Node(value);
        temp.next = move;
        move = temp;
    }
    public void printList(Node move)
    {
        while(move!=null)
        {
            System.out.print(move.data+"->");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Многократные наблюдения

Во-первых, list.head не инициализируется, хотя переменной перемещения в методе insertNode назначается ссылка на новый узел, она передается по значению, поэтому она не отражает обновленную ссылку обратно на list.node в основном методе. Вы можете обновить метод insertNode, чтобы он возвращал Node, возвращал 'move' обратно в основной метод и назначал возвращаемое значение для list.head. как показано ниже

// in main 
list.head = list.insertNode(1, list.head);
list.head = list.insertNode(2, list.head);
list.head = list.insertNode(3, list.head);

// in insertNode method return the move node back to caller
public Node insertNode(int value, Node move) {
    Node temp = new Node(value);
    temp.next = move;
    move = temp;
    return move;
}

Во-вторых, метод printList попадает в бесконечное число l oop, поскольку перемещение не передается следующему узлу

// in printList method add move = move.next inside the while loop as below
public void printList(Node move) {
    while (move != null) {
        System.out.print(move.data + "->");
        move = move.next; // ADD THIS LINE TO AVOID INFINTE LOOP
    }
}

Указанные выше изменения должны разрешиться и распечатать список.

Один вопрос, с текущим кодом связанный список действует как стек значений, так как новое значение всегда вставляется перед заголовком. поэтому метод printList будет печатать значения в обратном порядке вставленных значений.

Правильный способ метода insertNode, если целью является стек, будет

public void insertNode(int value) {
    Node temp = new Node(value);
    if (this.head == null) {
        this.head = temp;
    } else {
        temp.next = this.head;
        this.head = temp;
    }
}

Если целью LinkedList не является как стек, но чтобы хранить значения в том же порядке, в котором они были добавлены, метод insertNode должен быть таким, как показано ниже

public void insertNode(int value) {
    Node temp = new Node(value);
    if (this.head == null) {
        this.head = temp;
    } else {
        Node par = this.head;
        while (par.next != null) {
            par = par.next; 
        }
        par.next = temp;
    }
}

В методе main нет необходимости всегда передавать list.head, так как метод insertNode может доступ к головке напрямую, как показано ниже.

list.insertNode(1);
list.insertNode(2);
list.insertNode(3);
0 голосов
/ 04 февраля 2020

Проблема в printList методе:

public void printList(Node move) {
    while (move != null) {
        System.out.print(move.data + "->");
    }
}

Ваш move Узел всегда равен нулю, поэтому ничего не будет распечатано. Это означает, что на самом деле вы никогда не инициализировали list.head.

Даже если вы исправите это, пожалуйста, будьте осторожны, потому что вы получите бесконечный , а l oop - ваш код напечатает move.data -> навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...