循环遍历循环列表Java

循环遍历循环列表Java,java,circular-list,Java,Circular List,我想创建一个循环遍历循环链表的方法,本质上模仿令牌环网络。我创建一个0或1的随机数,如果它是0,它将删除列表中的第一项。如果它是一个,它只是说他们仍然登录 所以我应该有这样的东西 用户A已登录 用户B注销 用户A已注销 当列表被清除时,它终止 问题是它似乎总是留下一个特定的用户…我如何才能让它工作 public void log(){ if(start==null) System.out.println("List is empty..");

我想创建一个循环遍历循环链表的方法,本质上模仿令牌环网络。我创建一个0或1的随机数,如果它是0,它将删除列表中的第一项。如果它是一个,它只是说他们仍然登录

所以我应该有这样的东西

用户A已登录 用户B注销 用户A已注销

当列表被清除时,它终止

问题是它似乎总是留下一个特定的用户…我如何才能让它工作

public void log(){
        if(start==null)
            System.out.println("List is empty..");
        else{
        Node temp=start;

        System.out.print("->");
        //get rid of each user with a similar method but with a random user removed....
        while(temp.next!=null && count>0)
        {



            int  r = rand.nextInt(2);

            if(r==0)
            {

                deleteAt(0);
                System.out.println(" OFF"+temp.data);



            }

            else if(r==1)
            {
                   System.out.println(" ON "+temp.data);


            }
            temp=temp.next;
        }
                //System.out.println(counter);

    }
}

    public void deleteFirst() {
        Node temp=start;
        while(temp.next!=start){
        temp=temp.next;
    }
    temp.next=start.next;
    start=start.next;
    count--;
}




   public void deleteAt(int position){
       Node current=start;
       Node previous=start;

      for(int i=0;i<position;i++){
        if(current.next==start)
            break;
        previous=current;
        current=current.next;
    }

    if(position==0)
        deleteFirst();
    else
        previous.next=current.next;
    count--;
}
公共作废日志(){
if(start==null)
System.out.println(“列表为空…”);
否则{
节点温度=开始;
系统输出打印(“->”);
//使用类似的方法删除每个用户,但删除一个随机用户。。。。
while(临时下一步!=null&&count>0)
{
int r=兰特·奈克斯汀(2);
如果(r==0)
{
deleteAt(0);
系统输出打印项次(“关闭”+温度数据);
}
else如果(r==1)
{
系统输出打印项次(“ON”+温度数据);
}
温度=下一个温度;
}
//系统输出打印项次(计数器);
}
}
public void deleteFirst(){
节点温度=开始;
while(临时下一步!=开始){
温度=下一个温度;
}
温度下一步=开始下一步;
start=start.next;
计数--;
}
公共位置(内部位置){
节点电流=启动;
节点前一个=开始;

对于(int i=0;i而言,从循环链表中删除最后一个元素是一种特殊情况,因为您需要将start设置为null。因此,您需要在删除例程中考虑这一点:测试
start->next==start

除此之外,删除元素时在列表中循环需要特别小心:log()中外部循环中的temp可以指向已删除的元素,而不是列表中的元素。因此,使用
temp=temp->next
可能无效


另外,在deleteAt(0)中,计数会减少两次。

可能应该验证是否还有一项剩余,因为temp=temp.next引用本身让我很头疼。这不仅仅是将temp设置为temp中已经存在的值吗?这不是很好的做法,但不会影响程序,我错了吗?
deleteAt()
方法重新分配
next
?特别是,当您进入一个项目列表时,它是否会使
lastItem.next=lastItem
?@user3020002这取决于您的deleteAt()的方式方法有效。请发布。循环引用有时很痛苦。我添加了我的删除方法,一个用于删除任何方法,另一个用于删除列表中的第一个方法。