Удаление узла в LinkedList в java - PullRequest
0 голосов
/ 12 июля 2020

Мне нужно удалить узел из связанного списка в java с учетом int, который представляет индекс, который нужно удалить. Начало и конец списка определены вне метода, они определены в классе. Я определил следующий узел и данные внутри узла в другом классе publi c, и для них есть геттеры и сеттеры. Мне нужно вернуть данные, которые были найдены в удаляемом узле, а затем соответствующим образом скорректировать головку, хвост и размер (переменная, определенная в классе).

public class myExample<T> {
    private Node<T> head;
    private Node<T> tail;
    private int size;

    public T removeAtIndex(int index) {
        if (index < 1 | (index + 1) > size) {
            throw new IllegalArgumentException("Index out of bounds");
        }
        Node tempNode = head;
        if (index == 0) {
            head = tempNode.getNext();
        }
        for (int i = 0; tempNode != null && i < index - 1; i++) {
            tempNode.setNext(tempNode);
        }
        return (T) tempNode.getNext().getNext();
        tempNode.setNext(tempNode.getNext().getNext());
        tempNode.setNext(tempNode.getNext());
    }
}

1 Ответ

1 голос
/ 13 июля 2020

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

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

Во-вторых, вам нужно подумать об инкапсуляции данных и обязанностях классов. Я вижу, что ваш класс myexample содержит три поля: head, tail и size. Итак, за что отвечает myexample? Это реализация оболочки linkedlist? В таком случае необходимы другие подходящие методы. Вам необходимо определить роли и обязанности классов.

Между прочим, наличие tail похоже на реализацию Doubly-linked-list. Однако в вашем коде ничего не говорится о ссылках pre. Кажется, вам тоже нужно это исправить.

Затем, когда вы что-то набросали, вы можете начинать кодирование. Ваша первая задача на этом этапе реализации - преобразовать свои мысли в компилируемые операторы языка программирования. Итак, введите свой код, а когда закончите, скомпилируйте его. Ваш загруженный код не компилируется. Вам нужно это исправить.

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

Рассмотрим этот фрагмент кода:

    for (int i = 0; tempNode != null && i < index - 1; i++) {
        tempNode.setNext(tempNode);
    }

Давайте проследим это. До l oop, tempNode присваивается чему-то (на самом деле head). L oop выполняет итерацию, и следующий указатель tempNode присваивается самому себе (таким образом теряются ссылки на остальную часть связанного списка). Вы не обновляете tempNode в l oop, поэтому код выполняет это index-1 количество раз. L oop разрывает связи в первой итерации, а затем ничего не делает в следующих итерациях. Похоже, в этом l oop есть ошибка, и я думаю, вы заметили, в чем ошибка и как ее исправить.

...