-1

考虑以下代码来检测linkedlist是否有循环

 public boolean hasLoop() {

    Node<E> fast = first;
    Node<E> slow = first;

    while (fast != null && fast.next != null) {

        fast = fast.next.next;

        slow = slow.next;

        if (slow == fast) {

            return true;

        }

    }

    return false;

}

如果Sun Microsystems要在其中添加功能(例如:detectLoop, reverseLinkedlist, findIf2linkedlist intersect等)Linkedlist.java,他们会怎么做?注意,Sun 使用 Node 类作为内部细节(即私有)。

我能想到的几个选项(列出每个选项的缺点)

  1. Linkedlist.java 中的静态函数“hasLoop”?(这很奇怪,因为如果我想为现有的 hasLoop 做instance,我会称之为LinkedList.mergeSort(instance)而不是instance.mergeSort()

  2. Linkedlist.java 中的非静态函数“hasLoop”?(这会很奇怪,因为某些功能sort属于集合)

  3. 子类化 Linkedlist.java 并添加新函数“hasLoop”?(这会很奇怪,因为如果我需要添加另一个函数,比如say findIntersection,我需要创建另一个子类)

  4. 不知何故使用 Collections 并添加一个静态方法“hasLoop(List)”,并在 LinkedList.java 中添加其他接口以使其成为可能?(这会很丑陋,因为 Node 是具有内部实现的私有类,并且ptr.next不能由集合执行。它需要一些设置器来修改状态setNext()等)

4

1 回答 1

0

循环仅在所有列表之间存在链表的情况下才有意义。因此,此类功能应该特定于LinkedList. 最简单的方法是:

  • 将实例方法添加到 LinkedList 实现:hasLoop()

或者

  • 使 LinkedListLoopable<E>在哪里实现

    Loopable<E>{
       boolean hasLoop();
    }
    
于 2013-09-04T03:06:12.197 回答