循环遍历循环列表Java

时间:2014-10-17 20:57:57

标签: java circular-list

我想创建一个通过循环链表循环的方法,基本上模仿令牌环网络。我创建一个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--;
}

1 个答案:

答案 0 :(得分:0)

从循环链表中删除最后一个元素是一种特殊情况,因为您需要将start设置为null。因此,您需要在删除例程中满足此要求:测试是否start->next == start

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

此外,在deleteAt(0)中,count减少两次。