Эта реализация неэффективна, но это отчасти потому, что операция add (i, x) неэффективна в обычном связанном списке. Связанные списки не предназначены для произвольного доступа. Я думаю, что если вы создали хеш-таблицу или что-то еще, вы могли бы создать более эффективный индекс в списке. Например, рассмотрим карту. Затем ваша подпрограмма вставки (очевидно, есть особый случай для i = 0) map.ContainsKey (i-1) map.get (i-1), и вы сразу же получите предыдущий индекс. И если я! = 0, и у вас нет ключа для этого индекса, то вы сразу же знаете об ошибке. Карта в теории O (1), если не слишком много коллизий, так что это гораздо более эффективно (но за счет некоторого дискового пространства), чем повторять список каждый раз. Опять же, это действительно зависит, потому что чистый связанный список не очень эффективен для добавления (i, x).
Мне не особенно нравится этот метод, потому что он молча терпит неудачу, если вы говорите add (32, x) и в списке есть только 15 элементов. Он должен по крайней мере выдать исключение, вернуть false или что-то еще, чтобы указать, что вставка не удалась.
Также вы можете объединить два особых случая. Предполагая, что newNode.setNext (NULL) работает, вам просто нужно выполнить одну проверку для i == 0, а затем вы можете выполнить newNode.setNext (head), head = newNode, потому что список пустой или нет, это работает. Если список пуст, вы устанавливаете следующий указатель на NULL. Это, по крайней мере, устраняет повторяющийся код.
Взятие недели действительно кажется немного большим, но у некоторых людей возникают большие проблемы с тем, чтобы обернуть голову вокруг указателей (ну, ссылки на классы в javaspeak ....). Тот факт, что у вас есть что-то для работы, является отличным шагом в правильном направлении.