Двусвязный список - метод удаления - PullRequest
1 голос
/ 06 марта 2012

Я тоже пытаюсь удалить узел в двусвязном списке по индексу, который вводит пользователь. Кажется, для меня это имеет смысл, но после «удаления узла» и перепечатки содержимого списка ничего не изменилось. Я уверен, что это что-то глупое, что я скучаю. Любой совет?

public void removeEntryNode() {
    System.out
            .println("We delete by index here. Type in the number you want to delete");
    // print list for selection
    temp = head;
    while (temp != null && temp.getFirstName() != null) {
        System.out.print(temp.getIndex() + " " + temp.getFirstName() + " ");
        System.out.print(temp.getLastName() + " ");
        System.out.println(" ");
        temp = temp.getNext();
    }

    int selection = keyboard.nextInt();

    // Gets node matching index with selection and deletes it
    // Next two lines loop through list
    while (temp != null && temp.getIndex() != selection) {
        temp = temp.getNext();
    }

    // if it is the head
    if (selection == 0) {
        head = temp.getNext();
        temp.getNext().setPrev(null);
        temp.setNext(null);
        counter--;
    }
    // if it is the tail
    else if (selection == size()) {
        tail = temp.getPrev();
        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);
        counter--;
    } else {
        temp.getPrev().setNext(temp.getNext());
        temp.getNext().setPrev(temp.getPrev());
        temp.setNext(null);
        temp.setPrev(null);
        counter--;
    }

    System.out.println("Successfully deleted ");
    menu();
}

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

Невозможно точно определить точную проблему, не видя весь ваш код.

Тем не менее, я дам вам несколько советов:

1.

... temp.getIndex() != selection ...

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

2.

    else if (selection == size()){

Вероятно, здесь есть ошибка, одна за другой.

3.

        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);

Последняя строка гарантированно выбрасывает NullPointerException.

Как только вы исправите эти проблемы, я рекомендую пройтись по вашей программе в отладчике, чтобы посмотреть, действительно ли то, что происходит на самом деле, происходит на каждом этапе.

1 голос
/ 06 марта 2012

двойной связанный список имеет два указателя на предыдущий и следующий.

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

о поддержании значения индекса, я тоже не согласен, но это нормально, если вы можете сделать это отлично,

1 голос
/ 06 марта 2012

после того, как вы перечислили все элементы, на которые указатель temp указывает на конец списка, перед поиском элемента вы должны снова сделать указатель temp на голову.

   temp = head;
    //Gets node matching index with selection and deletes it
    //Next two lines loop through list
    while (temp!=null && temp.getIndex() != selection) {
        temp = temp.getNext();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...