Как удалить определенный узел в связанном списке - PullRequest
1 голос
/ 29 ноября 2011

Мне ранее требовалась помощь в отладке моего метода deleteNode.Теперь он работает (обновленная версия опубликована ниже), но я хочу, чтобы он предоставил случай, когда он должен удалить головной узел.На данный момент он возвращает исключение NullPointerException, в которое я вставил * в deleteNode.Я не знаю, как любая из моих переменных может быть нулевой в этот момент, поскольку мой цикл while требует, чтобы и position, и head не были нулевыми.

Ответы [ 4 ]

1 голос
/ 29 ноября 2011

Вот список проблем, которые я вижу:

  1. Перечислитель, который вы на самом деле хотите использовать, position, никогда не обновляется. Обновленный перечислитель, counter не нужен.

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

  3. Вы не имеете дела с особыми случаями. Что произойдет, если переданный список будет нулевым? Что происходит, если соответствующий узел является первым узлом? Последний узел?

  4. Вы должны вернуть заголовок связанного списка из вызывающей функции. Это требуется при удалении головного узла связанного списка.

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

1 голос
/ 29 ноября 2011

LinkedList.deleteNode(int) никогда не изменяет ни одного узла link, поэтому не удаляет элементы из списка.

Предположим, что nodeA.link == nodeB и nodeB.item == target. Затем вам нужно установить nodeA.link = nodeB.link, чтобы ничто больше не указывало на nodeB.

0 голосов
/ 29 ноября 2011

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

0 голосов
/ 29 ноября 2011

Посмотрите на свой deleteNode () во время кода цикла.

while(position != null && counter != null)
    {
        itemAtPosition = position.item;
        if(itemAtPosition == target)
        {
            position = position.link;
            isGone = true;
        }
        counter = counter.link;
    }

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

if(itemAtPosition == target)

никогда не возвращает true.Я подозреваю, что где-то вам нужно проверить на counter.item!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...