Найти узел в связанном списке и вернуть индекс - PullRequest
0 голосов
/ 18 июня 2020

Приведенный ниже код не возвращает правильный вывод для следующего ввода 10 20 20 30 -1 для элемента поиска 40 (n = 40 ). какова логическая ошибка в коде.

public class Solution {
    static int c=0; 
    public static int indexOfNRec(LinkedListNode<Integer> head, int n) {

        if(head.next==null )
        {
            return -1;
        }
        if(head.next==null && head.data!=n)
        {
            return -1;
        }
        if(head.next==null && head.data==n)
            {

                return 0;
            }
        if(head.data==n)
        {
          return c;
        }
            c=c+1;
            indexOfNRec(head.next,n);
            return c; 
    } 
}

1 Ответ

1 голос
/ 18 июня 2020

Вы проделали этот путь труднее, чем нужно. Попробуйте что-нибудь вроде этого:

public class Solution {
    public static int indexOfNRec(LinkedListNode<Integer> head, int n) {
        return solution(head, n, 0);
    }

    private static int solution(LinkedListNode<Integer> head, int searchFor, int index) {
        if(head == null )
        {
            return -1;
        }
        if(head.data == searchFor)
        {
            return index;
        }
        return solution(head.next, searchFor, index + 1);
    } 
}

Полагаю, ваш учитель сказал вам подпись используемого метода. Обратите внимание, что использовать переменные stati c так, как вы это сделали, действительно некрасиво, поскольку это не будет работать в многопоточной среде. Кроме того, поскольку вы никогда не очищаете их, это решение работает один раз. Если вас вызовут несколько раз, вы получите неправильное значение после первого вызова.

Итак, я сохранил вашу исходную подпись метода, но связал ее с методом, который получает индекс, который вы собираетесь вернуть . Это устраняет переменную stati c, что делает ваш код реентерабельным - потокобезопасным и может использоваться более одного раза.

Сам метод очень прост. Выполните нулевую проверку и верните нулевое значение. В противном случае, если мы найдем данные - отлично. Возвращение. Если нет, используйте рекурсию.

Это важный шаблон для понимания. Убедитесь, что вы знаете, что он делает, и убедитесь, что вы проводите тестирование с различными значениями. Я НЕ запускал это через компилятор, поэтому могут быть ошибки. Но, по крайней мере, вы можете видеть направление, в котором я шел.

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