我可以使用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
,我应该如何创建自己的循环/循环链表实现?你能给我看一下这个实现的框架吗
如果您需要更多详细信息,请告诉我,我会澄清任何混淆。
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;
}
}