Удаление узла в связанном списке

Попытка удалить узел по индексу сейчас. Я хотел бы распечатать список узлов с индексами, чтобы пользователь мог выбрать индекс, как показано. Я думаю, что моя логика в порядке при печати списка с индексами, но никаких входных данных не выходит :(

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

            else if (menu.equals("d")) {
            EntryNode temp = head;
            while (temp != null) {
                for (int i = 0; i < addressBook.length(); i++) {
                    //gets node at index
                    System.out.println(temp.getFirstName() + i);
                    temp = temp.getNext();
                }
            System.out.println(" ");
            System.out.println("Please enter the index of the entry you wish to delete ");
            int index = keyboard.nextInt();
            addressBook.removeEntry(index);
            }

        }

Метод удаления: public void removeEntry(int index){

    //delete from the head
    if (index == 0) {
        EntryNode temp = head;
        head = temp.getNext();
        temp.setNext(null);
        head.setPrev(null);
        size--;
    }
    //delete from the tail
    else if (index == length()) {
        EntryNode temp = tail;
        temp.setPrev(null);
        tail.setNext(null);
        tail = temp.getPrev();

        size--;
    }
    //in the middle
    else {
        EntryNode temp = head;
        for (int i = 0; i < index; i++) {
            //gets node at index
            temp = temp.getNext();
        }
        //set node after temp's previous to temp's previous 
        temp.getNext().setPrev(temp.getPrev());
        temp.getPrev().setNext(temp.getNext());
        temp.setNext(null);
        temp.setPrev(null);
        size--;
    }
}

Исключение NullPointerException происходит от:

//set node after temp's previous to temp's previous 
temp.getNext().setPrev(temp.getPrev());

person jackie    schedule 09.03.2012    source источник
comment
Разве else if (index == length()) { не должно быть вместо этого else if (index == length() -1 ) {? Если вы начнете индексацию с 0, а length() — это количество элементов, индекс хвоста будет length() - 1, а не length().   -  person biziclop    schedule 09.03.2012


Ответы (2)


Вы должны проверить, не является ли temp.getNext() null, прежде чем вызывать на нем setPrev().

Кроме того, вы должны проверить с помощью length()-1, так как у вас есть узлы с нулевой индексацией.

person Sapan Diwakar    schedule 09.03.2012
comment
Если temp.getNext() имеет значение null, тогда это не временный хвост? - person jackie; 09.03.2012
comment
Да, но если вы правильно выполняете проверку нулей, вам не нужно будет иметь специальный случай для головы и хвоста. - person biziclop; 09.03.2012
comment
@JackieAldama Да. Он переходит в блок in the middle, потому что ваша длина, вероятно, неверна (возвращает ли он actual-length (затем измените ваше условие) или actual-length - 1?). - person Sapan Diwakar; 09.03.2012
comment
Хорошо, я обновил это до оператора if, else, чтобы проверить, если temp==head, temp.getNext() == null или еще... - person jackie; 09.03.2012
comment
Что касается первой части вопроса, что-то явно не так с тем, как я пытаюсь вывести список с индексами для пользовательского ввода? - person jackie; 09.03.2012
comment
Да. Вы должны иметь либо while (temp != null) {, либо for (int i = 0; i < addressBook.length(); i++) {, но не оба. Я бы предпочел иметь первый. - person Sapan Diwakar; 09.03.2012
comment
Как мне получить индекс (i) И проверить, что temp.getNext не равен нулю? - person jackie; 09.03.2012
comment
1. Вы можете просто инициализировать i=0 перед началом while и увеличивать его каждый раз в цикле. 2. Вам не нужно проверять, является ли temp.getNext нулевым или нет. Кроме того, вы, вероятно, захотите оставить Sysos, int in... и ad... вне цикла while. - person Sapan Diwakar; 09.03.2012
comment
Вот что я понял. Поэтому я добавил счетчик = 0; а затем while(temp!=null) { распечатать temp, temp = temp.getNext() и увеличить счетчик. Тем не менее, печатается только то, что находится вне цикла (т.е. System... int index.. ad..) - person jackie; 09.03.2012
comment
Тогда, вероятно, ваш head это null для начала. - person Sapan Diwakar; 09.03.2012
comment
Ааа. Голова пуста, когда все начинается, но я тестирую это с узлами, добавленными в связанный список. - person jackie; 09.03.2012
comment
Но когда вы добавляете узлы в связанный список, обновляете ли вы head, чтобы он указывал на первый узел списка? - person Sapan Diwakar; 09.03.2012
comment
Да, это потому, что все это находится в основном методе, а не в классе AddressList? гр.. - person jackie; 09.03.2012

Индексы находятся в диапазоне [0, length() - 1], поэтому следует использовать

else if (index == length() - 1) {

вместо.

person Alexander Pavlov    schedule 09.03.2012