我可以使用java.util.LinkedList构建循环/循环链表吗?

时间:2010-09-18 15:05:39

标签: java data-structures linked-list circular-list

我想创建一个循环/循环链表,其中列表的尾部将指向列表的头部。那么我可以使用java.util.LinkedList并在创建列表后修改尾节点以使其成为循环/循环吗?如果是这样,你能告诉我一些如何发生的代码吗?

如果我不能使用java.util.LinkedList,我该如何创建自己的循环/循环链表实现?你能告诉我这个实现的外观吗?

如果您需要更多详细信息,请告诉我,我会澄清任何疑惑。

4 个答案:

答案 0 :(得分:18)

class ListNode {
    public ListNode next;
    public Object data;

    public ListNode(Object data, ListNode next) {
        this.next = next;
        this.data = data;
    }
}

class CircularLinkedList {
    private ListNode head = null;
    private int numberOfElements = 0;
    private ListNode actualElement = null;
    private int index = 0;

    public boolean isEmpty() {
        return (numberOfElements == 0);
    }

    public int getNumberOfElements() {
        return numberOfElements;
    }

    public void insertFirst(Object data) {
        if (!(isEmpty())) {
            index++;
        }
        ListNode listNode = new ListNode(data, head);
        head = listNode;
        numberOfElements++;
    }

    public void insertAfterActual(Object data) {
        ListNode listNode = new ListNode(data, actualElement.next);
        actualElement.next = listNode;
        numberOfElements++;
    }

    public boolean deleteFirst() {
        if (isEmpty())
            return false;
        if (index > 0)
            index--;
        head = head.next;
        numberOfElements--;
        return true;
    }

    public boolean deleteActualElement() {
        if (index > 0) {
            numberOfElements--;
            index--;
            ListNode listNode = head;
            while (listNode.next.equals(actualElement) == false)
                listNode = listNode.next;
            listNode.next = actualElement.next;
            actualElement = listNode;
            return true;
        }
        else {
            actualElement = head.next;
            index = 0;
            return deleteFirst();
        }
    }

    public boolean goToNextElement() {
        if (isEmpty())
            return false;
        index = (index + 1) % numberOfElements;
        if (index == 0)
            actualElement = head;
        else
            actualElement = actualElement.next;
        return true;
    }

    public Object getActualElementData() {
        return actualElement.data;
    }

    public void setActualElementData(Object data) {
        actualElement.data = data;
    }
}

答案 1 :(得分:10)

对于实际应用(例如,不仅仅是玩耍或学习),我个人更喜欢Guava的Iterables.cycle方法 - 请参阅http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#cycle%28java.lang.Iterable%29

答案 2 :(得分:2)

java.util.LinkedList是Collections数据类型之一。 Collections的目的是提供实用程序结构,而不是打扰程序员担心其内部实现。如果必须具有以某种方式工作的内部,并且java.util不能保证它们的工作方式,那么它们不适合您。

要实现循环链​​表,首先要创建一个ListNode类:

class ListNode {
    ListNode next;
    ListNode prev;
    Object data;
}

然后存储ListNode head,并确保prev head指向列表的“结尾”,并且“结束”的next指向head。但老实说,保持尾指针和循环链表的双向链表之间几乎没有区别。

答案 3 :(得分:1)

请参阅here以全面实现Java中的单链接列表。使它循环只是该代码中的一个调整。