如何使用循环链表解决Josephus消除问题

时间:2011-11-12 13:02:32

标签: c# algorithm data-structures linked-list josephus

    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;
         }
    }

我在计算机上使用计数器作为TAG,或者换句话说就是消除开始的位置。

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 个答案:

答案 0 :(得分: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;
}