2014-10-17 2 views
0

본질적으로 토큰 링 네트워크를 모방 한 순환 링크 된 목록을 반복하는 메소드를 만들고 싶습니다. 난 0 또는 1 중 하나를 임의의 번호를 만듭니다, 0이면 목록에서 첫 번째 항목을 삭제합니다. 그것이 하나 일 경우, 그들은 여전히 ​​로그온 상태라고 말합니다.Loop through Circular 목록 Java

그래서 나는 이런 식으로 뭔가를해야한다 ..

사용자 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--; 
} 
+0

은 아마도 temp = temp.next가 스스로를 참조하면 나에게 두통이 있다고 생각하기 때문에 하나의 항목이 남아 있다면 유효성을 검사해야합니다. –

+0

본질적으로 temp를 이미 temp로 설정하는 것뿐만 아니라? 좋은 연습은 아니지만 프로그램에 영향을주지는 않겠습니까? – user3020002

+0

'deleteAt()'메서드는'next'를 어떻게 다시 할당합니까? 특히, 하나의 아이템리스트에 도달하면,'lastItem.next = lastItem'을 생성합니까? – azurefrog

답변

0

순환 링크 된 목록에서 마지막 요소를 삭제하는 것은 특별한 경우입니다. 시작을 null로 설정해야하기 때문입니다. 따라서 삭제 루틴에서이를 처리해야합니다 : start->next == start 여부 테스트.

그 외에도 요소를 삭제하면서 목록을 반복 할 때는 특별한주의가 필요합니다. log()의 외부 루프에있는 temp는 목록의 요소가 아니라 제거 된 요소를 가리킬 수 있습니다. 그런 다음 temp=temp->next을 사용하는 것은 유효하지 않을 수 있습니다.

또한 count는 deleteAt (0)에서 두 번 감소합니다.