能否用 C# LinkedList<T> 實現約瑟夫環(Josephus Problem)?
LinkedList<T> 提供 O(1) 刪除當前節點、雙向遍歷,完美契合「圓圈中每隔 k 個刪除一個」的場景。
using System;
using System.Collections.Generic;
public class Josephus {
public static int Solve(int n, int k) {
var circle = new LinkedList();
for (int i = 1; i <= n; i++) circle.AddLast(i);
var current = circle.First;
while (circle.Count > 1) {
// 移動 k-1 步 (當前節點算第1步)
for (int i = 1; i < k; i++) {
current = current.Next ?? circle.First; // 環形
}
var toRemove = current;
current = current.Next ?? circle.First; // 預先移到下一個
circle.Remove(toRemove);
}
return circle.First.Value;
}
}
// 測試
Console.WriteLine(Josephus.Solve(5, 2)); // 經典 5人報數2 -> 3
Console.WriteLine(Josephus.Solve(41, 3)); // 約瑟夫傳說 41人報數3 -> 31
current.Next ?? circle.First 實現尾部回頭。toRemove,再移動 current 到下一節點,最後 Remove,避免迭代器失效。public static List EliminationOrder(int n, int k) {
var circle = new LinkedList();
for (int i = 1; i <= n; i++) circle.AddLast(i);
var order = new List();
var current = circle.First;
while (circle.Count > 0) {
for (int i = 1; i < k; i++)
current = current.Next ?? circle.First;
order.Add(current.Value);
var next = current.Next ?? circle.First;
circle.Remove(current);
current = next;
}
return order;
}
LinkedList<T> 類文檔