Вы не обращая внимания на результат countRec()
- и вы перебор в рекурсивном вызове, поражение цели. (Вы также делаете рекурсивный вызов на одном и том же объекте, без параметров и без изменения состояния ... так что это не может сделать ничего хорошего.) Мой рекурсивный подход будет основываться на схеме:
- Если следующий узел равен NULL, размер списка равен 1
- В противном случае размер равен 1 + от следующего узла.
Итак:
private int countRec() {
return next == null ? 1 : 1 + next.countRec();
}
Теперь, не позволяет получить список длины 0 конечно ... Вы, вероятно, хотите, чтобы отделить идею списка от узла, в этом случае список классов будет иметь что-то вроде:
public int count() {
return head == null ? 0 : head.countRec();
}
где значение head
является ссылкой на головной узел, если есть один или null
иначе.
Конечно, это будет O (n) во времени и. Вы можете получить пространство O (1), используя итерацию вместо рекурсии, и время O (1), просто сохранив размер списка в качестве переменной экземпляра в списке, обновив его, когда вам нужно. Я надеюсь, что этот вопрос был основан на требованиях к образованию, а не в реальном коде, хотя в производственном коде вы просто использовали уже предоставленные коллекции.
'int count = 1;' вы всегда устанавливаете счетчик в 1, увеличивая его и возвращая. – TheLostMind
count не должен быть локальной переменной для вашего метода. – zerocool
. Вы сбрасываете счет с помощью вызова метода, и каждый метод countRec() устанавливает значение «1», чтобы узел «это» содержал один и тот же результат каждый раз, когда –