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

我可以使用java.util.LinkedList构建循环/循环链表吗?,java,data-structures,linked-list,circular-list,Java,Data Structures,Linked List,Circular List,我想创建一个循环/循环链接列表,其中列表的尾部将指向列表的头部。因此,我可以使用java.util.LinkedList并在创建列表后修改尾部节点,使其循环使用吗?如果是这样的话,你能给我看一些关于如何实现的代码吗 如果我不能使用java.util.LinkedList,我应该如何创建自己的循环/循环链表实现?你能给我看一下这个实现的框架吗 如果您需要更多详细信息,请告诉我,我会澄清任何混淆。

我想创建一个循环/循环链接列表,其中列表的尾部将指向列表的头部。因此,我可以使用
java.util.LinkedList
并在创建列表后修改尾部节点,使其循环使用吗?如果是这样的话,你能给我看一些关于如何实现的代码吗

如果我不能使用
java.util.LinkedList
,我应该如何创建自己的循环/循环链表实现?你能给我看一下这个实现的框架吗


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

要实现循环链表,请首先创建ListNode类:

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

然后存储一个
ListNode head
,并确保
head
prev
指向列表的“end”,而
next
的“end”指向
head
。不过,老实说,保持尾部指针的双向链表和循环链表之间没有什么区别。

用于实际应用(例如,不仅仅是玩耍或学习)我个人更喜欢番石榴的
Iterables.cycle
方法-请看

为什么你想要一个循环链表?我只是想做一个循环链表。除了我自己,没有真正的理由。我还没有在网上看到过很多这方面的实现,我只是想尝试一下。@puddingfox:循环列表对于循环访问集合很有用(例如用于负载平衡)@user359996:使用循环列表进行循环只是一种很好的编程实践吗?我知道“循环”和“循环”是同时存在的,但是在数组列表上使用循环列表还有其他原因吗?循环列表的实现方式并不是非常重要。在你看来,我个人会使用ArrayList,然后用。编辑:显然,这甚至是有人给出的答案之一……我不需要“双向”链接列表,所以不需要
listnodeprev
。但是谢谢你的建议。我会尝试一下。deleteActualElement方法中有两个小错误,我已经纠正了它们。
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;
    }
}