Неожиданное поведение LinkedList в Java - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь решить проблему с Hacker Rank, которая требует использования LinkedList, и я обнаружил нечто странное. Цель состоит в том, чтобы напечатать LinkedList в обратном порядке.

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

В первом фрагменте кода ниже я могу поместить только первый и последний элементы LinkedList в ArrayList.

static void reversePrint(SinglyLinkedListNode head) {
    List<Integer> tempList = null;

    if (head == null)
        return;
    else {
        tempList = new ArrayList<>();
        tempList.add(head.data);
        while(head.next != null)
            head = head.next;
        tempList.add(head.data);
    }
    System.out.println("Size of the List -"+tempList.size());
    for(int i = tempList.size()-1; i >= 0; i--)
        System.out.println("Index +"+i+" "+tempList.get(i));
}

В следующем фрагменте кода я получаю java.lang.OutOfMemoryError: Java heap space и не могу понять, что на самом деле вызывает эту ошибку.

static void reversePrint(SinglyLinkedListNode head) {
    List<Integer> tempList = null;

    if (head == null)
        return;
    else {
        tempList = new ArrayList<>();
        while(head.next != null)
            tempList.add(head.data);
        head = head.next;
    }
    tempList.add(head.data);
    System.out.println("Size of the List -"+tempList.size());
    for(int i = tempList.size()-1; i >= 0; i--)
        System.out.println("Index +"+i+" "+tempList.get(i));
}

1 Ответ

5 голосов
/ 20 апреля 2019

Вы всегда должны использовать скобки вокруг блоков кода.

static void reversePrint(SinglyLinkedListNode head) { 
    List tempList = null;

    if (head == null)
        return;
    else{
        tempList = new ArrayList<Integer>();
        while(head.next != null) {
            tempList.add(head.data);
            head = head.next;
        }
    }
    tempList.add(head.data);
    System.out.println("Size of the List -"+tempList.size());
    for(int i = tempList.size()-1;i>=0;i--)
        System.out.println("Index +"+i+" "+tempList.get(i));   

}

Ваш код был таков, что цикл while был только одним оператором: tempList.add(head.data);

Оператор прогрессии head = head.next; не был частью цикла.Так что твой цикл был бесконечным.Вот почему вы получаете ошибку OOM.Я только добавил скобки.

РЕДАКТИРОВАТЬ: То же самое касается первого метода.Он не добавляет ничего в список - просто просматривает связанный список (добавьте также скобки)

...