【问题标题】:Using ListIterator on a custom LinkedList在自定义 LinkedList 上使用 ListIterator
【发布时间】:2011-04-27 14:58:09
【问题描述】:

我有一个我自己构建的自定义、通用、单独的 LinkedList。我可以在列表中添加、删除等。我想为我的班级实现 Java ListIterator。我将如何开始这个?我需要在课堂上添加哪些方法?我在网上能找到的只是在默认的 Java LinkedList 上使用 ListIterator 的示例,这对我没有好处。谢谢!

【问题讨论】:

  • 你不能在单链表上以理智的方式实现ListIterator,因为ListIterator需要支持反向遍历,而这对于单链表是不可能的!
  • @Joachim - 这绝对是可能的;只是非常低效。要后退,您只需要从列表的开头开始并前进,直到到达将当前节点作为其“下一个”元素的节点。
  • @Sean - 他还说反向遍历是“不可能的”。
  • @Ted 从技术上讲确实如此。这是不可能的,所以你必须伪造它。
  • @Sean - 我认为我们对“不可能”的含义有非常不同的想法。 :-)

标签: java listiterator


【解决方案1】:

您创建了第二个类(通常是链表的嵌套类),它实现了 ListIterator 接口的所有功能。请注意,某些函数(如 addremove)是可选的——您可以只抛出 UnsupportedOperationException。您的链表类需要实现 listIterator()listIterator(int) 方法以返回您的第二个类的实例。

【讨论】:

    【解决方案2】:

    您应该实现IteratorListIterator 接口。

    【讨论】:

    • 根据他的问题 ListIterator 接口,但是是的,你是对的。
    【解决方案3】:

    查找 ListIterator 具有的方法。您需要确保您的版本具有相同的方法。

    如果可以,请查找 ListIterator 使用的 Interface,并实现该接口。

    【讨论】:

      【解决方案4】:

      为了提高性能,您可以实现 ListIterator 并在迭代时保留列表的“向后”版本。这将模拟一个双向链表,但仅适用于迭代器。

      但是,将链表实现为下面的双向链表可能更安全。

      【讨论】:

        【解决方案5】:

        如果它是一个单链列表,实现ListIterator 会很棘手(如果不是不可能的话),因为它需要双向导航,而您只能通过一遍又一遍地从头开始来实现。

        要么让你的列表双链接,要么你必须在很多方法上抛出UnsupportedOperationException。 (或者在一半的方法中使用 O(n) 性能)

        【讨论】:

        • 我不认为抛出 UnsupportedOperationException 是previous() 的合法实现;它不是记录为可选的方法之一。另外,为什么单个(前向)链表对next() 有 O(n) 性能?
        • @Ted a) 我知道。这就是为什么我会说这不是 java.util.List 的有效实现 b) 好的,你明白了:9 种方法中有 5 种会合理执行
        猜你喜欢
        • 2012-11-09
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-19
        • 1970-01-01
        • 2015-05-26
        • 1970-01-01
        相关资源
        最近更新 更多