#java #iterator #doubly-linked-list
Вопрос:
У меня есть задание, в котором я должен сделать данный класс двусвязного списка итеративным. Мне не разрешается изменять или добавлять какие-либо дополнительные методы. Этот код работает просто отлично, мне просто было любопытно, смогу ли я написать его без использования локальной переменной. n
является текущим узлом, на котором находится итератор. n.succ
является следующим узлом в списке (который равен нулю, если нет следующего значения). n.pred
является предыдущим узлом в списке (который равен нулю, если нет предыдущего значения). n.val
это значение, хранящееся в узле. Вот что у меня сейчас есть (что отлично работает).
/** Return the next element to enumerate. */ public @Override E next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); Node n1 = n; n = n.succ; return n1.val; }
Я не могу сказать
n = n.succ; return n.pred.val;
потому что если n.succ
значение равно null, то n.pred
возникнет исключение NullPointerException.
Комментарии:
1.
return n == null ? tail.val : n.pred.val;
Вы также можете использовать циклический двойной связанный список . Тогда это было бы просто твоеn.pred.val
.2. Может быть, вы можете избежать переменной с помощью какого-то запутанного кода, но зачем вам это делать?
3. @JoopEggen Это работает! Я не могу использовать циклический двойной связанный список, потому что это задание для класса, в котором я должен использовать ИХ самодельный класс двойного связанного списка. Если вы хотите, опубликуйте свой комментарий в качестве ответа, и я поддержу его и отмечу галочкой для репутации.
4. Идти вперед. Наличие переменной тоже неплохо. Например, в реализации
i
. Также вы можете сделатьreturn (n == null ? tail : n.pred).val;