2011-11-12 13 views
1
class Node 
    { 
     public int Data { get; set; } 

     public Node Next { get; set; } 

     public int Counter { get; set; } 

     public Node(int element,int counter) 
     { 
       Data = element; 
       Counter = counter; 
       Next=null; 
     } 
    } 

私はカウンターを人のタグとして、言い換えれば消去の開始位置として使用します。サークルリンクリストを使用して、ヨセフス除去を解決する方法

class CircularLinkedList 
{ 
    Node first; 
    Node last; 

    public CircularLinkedList() 
    { 
     first = last = null; 
    } 

    protected void Insert(int element,int counter) 
    { 
     if (IsEmpty()) 
     { 
      first = last = new Node(element,counter); 
     } 
     else 
     { 
      last.Next = last = new Node(element,counter); 
      last.Next = first; 
     } 
    } 

    public int RemoveAt(int index) 
    { 
     int value = 0; 
     Node current = first; 
     do 
     { 
      if (current.Counter == index) 
      { 
       value = current.Data; 
      } 
      current = current.Next; 
     } while (current != first); 
     return value; 
    } 

    public void AddMen(int n) 
    { 
     for (int i = 1; i <= n; i++) 
     { 
      Insert(i*2,i); 
     } 
    } 

    public int Eliminate(int m) 
    { 
     int value = 0; 
     Node current = first; 
     do 
     { 
      value = RemoveAt(m); 

      current = current.Next; 

     } while (current != first); 
     return value; 
    } 

    public bool IsEmpty() 
    { 
     return first == null; 
    } 

    public void Display() 
    { 
     Node current = first; 
     do 
     { 
      Console.WriteLine(current.Counter+" "+current.Data+" "); 
      current = current.Next; 
     } while (current!=first); 
    } 
} 

私は、私はどうしたら、私はリストが空になるまで、それは常に呼び出さなければなりませんしたい、

答えて

1

を消去法で問題を抱えています:

public int Eliminate(int m) 
{ 
    int value = 0; 
    Node current = first; 
    Node nextNode; 



    do 
    { 
    nextNode = current.next; 
     value = RemoveAt(m); 

     current = nextNode; 

    } while (current != first); 
    return value; 
} 
関連する問題