我正在通过阅读一本书来了解我的数据结构,其中一个问题是建立一个循环的单链表,而不使用"第一个" &安培; "最后"指针,但允许使用一个引用" current"来访问它。我不确定我是否理解这个问题,我一直以为我至少需要第一个或最后一个。这是我的实现,但它有#34;首先",不知道如何解决它。您能评论我如何调整我的代码以消除对第一个的依赖吗?
class Link {
public int iData;
public Link next;
public Link(int id) { // constructor
iData = id;
}
public void displayLink() {
System.out.print(iData + " ");
}
} // end class Link
然后是列表本身:
public class CircularLinkedList {
private Link first;
private Link current;
public Link getCurrent(){
return current;
}
public void setCurrent(int data){
}
public void advance(){
current = current.next;
}
public void insert(int data) {
Link newLink = new Link(data);
if (first == null) {
first = current = newLink;
} else {
current.next = newLink;
}
current = newLink;
newLink.next = first;
}
...
}
答案 0 :(得分:6)
如果您有循环链表,则每个节点都指向连续循环中的下一个节点。所以没有最后也没有第一个。在这种情况下,您只需要一个指向数据结构的指针(问题称为“当前”),因为您可以遍历整个列表,直到返回到您开始的位置。
一个节点可能如下所示:
/*/*/@number
因此,在这种环境中,当您将第一个节点添加到列表中时,它的“下一个”指针将指向自身。添加第二个节点时,每个“下一个”指针将指向另一个节点。当你添加第三个节点时,它们将分别指向下一个节点,并且可能是以某种方式对它进行排序。添加的每个附加节点都将插入循环中的适当位置。
对于像这样的数据结构的良好用法是每天或每小时重复的计划。所有事件都可以存储在循环列表中,“当前”指针始终指向下一个计划的任何一个。
显然,在搜索这样的列表时,您需要保留对第一个节点的引用。这是你可以知道你是否已经搜索整个列表的唯一方法,因为它不会以空的“下一个”指针结束。
编辑:正如下面(广泛)评论中所讨论的,对于插入操作,“尾部”指针似乎是一个非常好的主意。以下是我发布的原始方法,该方法已重命名为public class ListNode<T> {
private T element;
private ListNode<T> next;
}
:
insertAfter
尾部指针始终指向列表的最后一个节点。这也是第一个节点之前的节点,因为列表是循环的。所以在操作指针时一定要保持public void insertAfter(int data) {
Link newLink = new Link(data);
if (current == null) {
newLink.next = newLink;
current = newLink;
} else {
newLink.next = current.next;
current.next = newLink;
}
}
。这是新的插入方法:
(tail.next == current)
插入值应该正确地将它们排除在外。要在添加时保持顺序,应使用public void insert(int data) {
Link newLink = new Link(data);
if (current == null) {
current = newLink;
tail = newLink;
newLink.next = newLink; // tail.next = current!
} else {
tail.next = newLink; // tail.next = current!
newLink.next = current;
current = newLink; // tail is unchanged, newLink is current
}
}
方法:
add
以下是public void add(int data) {
this.insert(data);
this.advance();
}
的代码:
advance
当像这样用来创建列表时......
public void advance() {
if (current != null) {
tail = current;
current = tail.next; // tail.next = current!
}
}
...两个列表都按1-2-3排序,1为当前。
答案 1 :(得分:0)
使用Node current, int currentIndex, int size
。让最后一个Node next
指向列表的第一个节点(=循环)。使用当前索引,您可以遍历(size-1)元素以到达current
的上一个节点。
答案 2 :(得分:0)
由于链表是圆形的,因此没有第一个和最后一个元素。
您可以从任何节点(此上下文中的当前节点)开始遍历整个列表。
所以Node
类只有下一个引用,CircularLinkedList
只有当前引用。
希望这有帮助。
祝你好运。