Застрял в бесконечном цикле при добавлении узла в связанный список - PullRequest
1 голос
/ 17 октября 2019

Я пытался выяснить, почему этот код застрял в бесконечном цикле. Предыстория заключается в том, что я нашел решение, я изменил конструктор, чтобы назначить head равным нулю, и это исправило его.

Интересно, почему этот код НЕ работает.

Когда я добавляю разные узлы, он работает. Код работает как положено.

Проблемы возникают при добавлении того же узла.

public class Main {
    public static void main(String[] args) {
        Node one = new Node(1);
        Node two = new Node(2);

        LinkedList list = new LinkedList(one);
        // this gives error, if i add the same nodes
        list.add(two);
        list.add(two);

        System.out.println("Printing out:\n" + list.toString() +"\n");
    }
}


public class LinkedList {
    Node head;
    int length = 0;
    public boolean isEmpty() {
        return (head==null);
    }

    public String toString() {
        Node current = head;
        String string = "Head: ";

        while(current.next != null) {
            string += current.toString() + " --> ";
            current = current.next;
        }
        string += current.toString() + " --> " + current.next;
        return string;
    }

    public LinkedList(Node node) {
        // if were to set head to null and no arg, it works fine
        head = node;
        length = 1;
    }

    public void add(Node node) {
        if(isEmpty()) {
            System.out.println("Empty list, adding node...");
            head = new Node(node.data); ++length;
            return;
        }
        else {

        Node current = head;
        while(current.next != null) {
            current = current.next;
        }
        //current.next = new Node(node.data);
        current.next = node;
        ++length;
        return;
        }
    }

Ошибка в том, что она никогда не заканчивается, поэтому я думаю, что она зациклена навсегда.

Ответы [ 3 ]

1 голос
/ 17 октября 2019

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

0 голосов
/ 18 октября 2019

Неправильная строка в вашем коде находится в методе add current.next = node. Попробуйте изменить его на «current.next = new Node (node.data)»

0 голосов
/ 17 октября 2019

Это происходит в цикле infinte из-за цикла while в методе toString () класса LinkedList.

вы проверяете условие

while(current.next != null) { .....}

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

Чтобы устранить эту проблему, добавьте точку узла. node.next = null;

        current.next = node;
        node.next = null;
        ++length;
        return;

Оно будет завершено и будетне заходить в бесконечный цикл

...