Могу ли я написать эту реализацию Iterator.next() без локальной переменной (двойной связанный список)

#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;