class main { static void Main() { const int size = 100; int flag = 0; int[] intArray = new int[size]; for (int i = 0; i < size; i++) { intArray[i] = i + 1; } LinkedList<int> ll = new LinkedList<int>(intArray); NextNode(ll.First, flag); } static void NextNode(LinkedListNode<int> ln, int flag) { if (ln != null) { if (ln.List.Count > 2) { ++flag; if (ln.Next == null) { LinkedListNode<int> lln = ln.List.First; if (flag == 2) { Console.Write(ln.Value + " (" + ln.List.First.Value + "-out) "); lln = ln.List.First.Next; ln.List.Remove(ln.List.First); flag = 0; NextNode(lln, flag); } else { Console.Write(ln.Value + " "); NextNode(lln, flag); } } else { if (flag == 2) { Console.Write(ln.Value + " (" + ln.Next.Value + "-out) "); ln.List.Remove(ln.Next); flag = 0; NextNode(ln.Next, flag); } else { Console.Write(ln.Value + " "); NextNode(ln.Next, flag); } } } } } }
原来的帖子在这里: http://topic.csdn.net/u/20080115/22/ab03ef9f-d785-41c3-9d83-da6cead94356.html static void Main(string[] args) { int n = 50; int m = 3; Console.WriteLine(GetOneBasedIndex(n, m)); Console.ReadLine(); } static int GetOneBasedIndex(int n, int m) { return GetZeroBasedIndex(n, m, 0) + 1; } //核心代码就这个方法 static int GetZeroBasedIndex(int n, int m, int offset) { if (n == 1) return 0; int index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m); return index + (index + offset) / (m - 1); } 可以改版成Long型计算n超过int最大值,m不能太大,否则堆栈溢出
class main
{
static void Main()
{
const int size = 100;
int flag = 0;
int[] intArray = new int[size];
for (int i = 0; i < size; i++)
{
intArray[i] = i + 1;
}
LinkedList<int> ll = new LinkedList<int>(intArray);
NextNode(ll.First, flag);
}
static void NextNode(LinkedListNode<int> ln, int flag)
{
if (ln != null)
{
if (ln.List.Count > 2)
{
++flag;
if (ln.Next == null)
{
LinkedListNode<int> lln = ln.List.First;
if (flag == 2)
{
Console.Write(ln.Value + " (" + ln.List.First.Value + "-out) ");
lln = ln.List.First.Next;
ln.List.Remove(ln.List.First);
flag = 0;
NextNode(lln, flag);
}
else
{
Console.Write(ln.Value + " ");
NextNode(lln, flag);
}
}
else
{
if (flag == 2)
{
Console.Write(ln.Value + " (" + ln.Next.Value + "-out) ");
ln.List.Remove(ln.Next);
flag = 0;
NextNode(ln.Next, flag);
}
else
{
Console.Write(ln.Value + " ");
NextNode(ln.Next, flag);
}
}
}
}
}
}
http://topic.csdn.net/u/20080115/22/ab03ef9f-d785-41c3-9d83-da6cead94356.html static void Main(string[] args)
{
int n = 50;
int m = 3;
Console.WriteLine(GetOneBasedIndex(n, m));
Console.ReadLine();
} static int GetOneBasedIndex(int n, int m)
{
return GetZeroBasedIndex(n, m, 0) + 1;
} //核心代码就这个方法
static int GetZeroBasedIndex(int n, int m, int offset)
{
if (n == 1)
return 0;
int index = GetZeroBasedIndex(n - (n + offset) / m, m, (n + offset) % m);
return index + (index + offset) / (m - 1);
}
可以改版成Long型计算n超过int最大值,m不能太大,否则堆栈溢出