【问题标题】:Converting Linked List to a Circular Linked List in JAVA在 JAVA 中将链表转换为循环链表
【发布时间】:2012-12-25 20:07:53
【问题描述】:

有什么方法可以将 LinkedList 类的对象转换为循环链表。

或者在 java.util 中有没有像 CircularLinkedList 这样的预定义类 像这样的东西(像http://docs.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html这样的东西)

任何帮助将不胜感激......

在此先感谢 :-)

【问题讨论】:

  • 最终目标是什么。 Guava 的 Iterators.cycle() 方法可能正是您想要的。您也可以自己包装清单,这应该不会太难,但这取决于目标是什么。
  • 趣事:LinkedList 实际上在内部实现为循环链表with a dummy header node

标签: java data-structures


【解决方案1】:

不,LinkedList 的封装方式使其无法将其尾部连接到头部。我不认为任何默认集合都支持这一点,因为那样它就不会再履行Iterable 的合同,这意味着迭代器必须在某个时候到达终点。

当你需要这样的数据结构时,你必须自己实现它。

【讨论】:

  • 事实上,Iterable 和 Iterator 都没有这样说。每次调用 hasNext() 时,它很可能返回 true。
  • ...然后将其传递给任何接受 Iterable 的 API,然后在无限循环中捕获它。
  • 我认为会被破坏的关键合约是 List 合约。我不认为多次返回每个元素的迭代器将是“按正确顺序遍历此列表中元素的迭代器”。列表中的最后一个元素将出现在第一个元素之前和之后。
  • @Philipp:是的,当然,这和其他错误一样是一个错误。如果您不想要无限循环,则不要将无限迭代器传递给无限循环的方法。
【解决方案2】:

看看 Guava 的 Iterables.cycle 方法。

public static <T> Iterable<T> cycle(Iterable<T> iterable)

返回一个迭代器,它的迭代器在迭代器的元素上无限循环。

如果iterable.iterator() 支持,则该迭代器支持 remove()。调用 remove() 后,后续循环将忽略已删除的元素,该元素不再可迭代。迭代器的hasNext() 方法返回true,直到iterable 为空。

参考文档:http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#cycle%28java.lang.Iterable%29

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多