Java中的循环LinkedList

时间:2015-04-22 16:32:30

标签: java data-structures linked-list

我正在通过阅读一本书来了解我的数据结构,其中一个问题是建立一个循环的单链表,而不使用"第一个" &安培; "最后"指针,但允许使用一个引用" 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;
    }
    ...
}

3 个答案:

答案 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只有当前引用。

希望这有帮助。
祝你好运。