поиск и удаление узла из связанного списка - PullRequest
0 голосов
/ 14 января 2020

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

Это функция, которую я написал.

public boolean remove(String s)
    {
        if(head.getName().equalsIgnoreCase(s))
        {
            head = head.getNext();
            return true;
        }

        else
        {
            Node p =head;
            Node current=p.getNext();

            while(true) {
                if(current == null || current.getName().equals(s)) {
                    break;
                }
                p = current;
                current = current.getNext();
            }
            if (current == null)
            {
                p.setNext(current.getNext());
                return true;
            }
        }
        return false;
    }

Я использую Node p для хранения предыдущий узел и текущий узел.

Код попадает в секцию возврата false, и в списке нет изменений. Также я получаю предупреждение об исключении нулевого указателя в p.setNext ( текущий .getNext ()) здесь.

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

Ответы [ 3 ]

3 голосов
/ 14 января 2020

Относительно исключения нулевого указателя это должно звучать как звонок

if (current == null)
{
    p.setNext(current.getNext());
    return true;
}

current равно нулю, и вы пытаетесь вызвать из него метод.

Также оно не похоже, что вы обрабатываете угловые случаи, например, список пуст или имеет один элемент.

1 голос
/ 14 января 2020
current == null

- это не найденный случай. Когда current == null мы должны вернуть false, а вызов current.getNext() выдаст ошибку нулевого указателя. Точно так же найденный случай не попадает в нужный вам блок. Думаю, должно быть достаточно сказать if (current != null), где у вас есть if (current == null)

Я нашел https://www.geeksforgeeks.org/linked-list-set-3-deleting-node/ полезным.

0 голосов
/ 14 января 2020

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

while(true) {
                if(current == null || current.getName().equals(s)) {
                flag = true;
                    break;
                }
                p = current;
                current = current.getNext();
            }
            if (flag)
            { 
            if(current!=null)
                p.setNext(current.getNext());
            return true;
            }
...