Java编程 - 循环链表

时间:2010-11-29 04:41:03

标签: java linked-list

我正在尝试编写一个包含通常的Node内部类和实例变量的java类CircularList:

4 个答案:

答案 0 :(得分:2)

好的,我不会给你全部的课程实施,但我会给你一些建议。

  1. 您无需持有对最后一个元素的引用。将Prev和Next引用放在节点上,最后一个节点将是first.Prev
  2. 除了循环列表没有结束这一事实外,它们与常规列表完全相同,但是你找到最后一项如下:

    节点tmp = first;

    while(tmp.Next!= null)    tmp = tmp.Next;

  3. 在循环列表中,这个想法是这样的:

    Node tmp = first;
    
    while ( tmp.Next != first )
       tmp = tmp.Next;
    

    因为除非列表为空,否则永远不会找到指向null的节点。最后一条建议,如果你需要实现一个索引器,请记住在循环列表中没有索引超出范围的事情,因为

    list[count] = list[0] = list[count * k]
    

    请记住这一点,因此计算这些方法的索引可能非常棘手。对于正面指数,主要思想是:

    index = index % count;
    

    对于消极的,略有不同。我希望我能帮助你。如果你想要一个实现,我相信如果你礼貌地问谷歌应该有一些:)

    祝你好运!

答案 1 :(得分:2)

我不确定你的问题是什么,你似乎已经拥有了所需的一切。该链表与普通链表之间的唯一区别是添加到结尾。

在常规链接列表中,您将创建一个新节点,并使最后一个元素指向该节点。在这种情况下,您将•Last节点中的指针更改为指向新节点,并使新节点指向•First。

删除与普通链表的工作方式相同。每当你想要移除一个节点时,你会发现哪个节点指向那个节点(前一个节点,或者在删除第一个节点的情况下,检查•最后一个节点)并指向要删除的节点指向的任何地方。

如果这不能解决您的问题,请通知我,我会尽力帮助您。

注意到有人已经问过完全相同的问题: Can I use java.util.LinkedList to construct a circular/cyclic linked list?

答案 2 :(得分:0)

提示......循环列表应该包含next和previous,而不是first和last。逻辑很重要

答案 3 :(得分:0)

class Node    {
    int value;
    Node next;
    Node prev;
    Node(int initialValue)    {
        value = initialValue;
        next =  null;
        prev = null;
    }
    public int getValue()    {
        return this.value;
    }
}

class NodeList    {
    Node pointer;
    NodeList()    {
        pointer = null;
    }
    public void insertNode(int nodeValue)    {
        Node newNode = new Node(nodeValue);
        if( pointer == null )    {
            newNode.next = newNode;
            newNode.prev = newNode;
        }else if( pointer.next == null && pointer.prev == null && pointer != null )    {
            newNode.next = pointer;
            newNode.prev = pointer;
            pointer.prev = newNode;
            pointer.next = newNode;
        }
        else if( pointer != null )    {
            newNode.next = pointer.next;
            newNode.prev = pointer;
            pointer.next.prev = newNode;
            pointer.next = newNode;
        }
        pointer = newNode;
        System.out.println(“Successfully inserted : ” + pointer.getValue());
    }
    public void printRing( boolean direction )    {
        Node tempNode = pointer;
        do    {
            System.out.println( “Value = ” + tempNode.getValue() );
            tempNode = direction ? tempNode.next : tempNode.prev;
        } while( tempNode.value != pointer.value );    
    }    
}