while (true) {
Object out = l1.get(n - 1);
l2.add(out);
l1.remove(out);
n--; n += 3;
while (n - 1 >= l1.size()) n -= l1.size();
if (l1.size() == 0) break; // <-- 位置太靠後
}
當移除最後一個元素後,l1.size() == 0,但代碼**仍會執行** n--; n += 3; while (n-1 >= 0) n -= 0; 導致 n 不變,下一次迴圈 l1.get(n-1) 拋 IndexOutOfBoundsException 或邏輯卡死。
while (!l1.isEmpty()) { // 直接以集合非空為迴圈條件
Object out = l1.get(n - 1);
l2.add(out);
l1.remove(out);
if (l1.isEmpty()) break; // 立即跳出,避免後續索引運算
n = (n + 2) % l1.size(); // 合併 n--; n+=3; 取模運算更簡潔
if (n == 0) n = l1.size(); // 取模結果 0 代表最後一個
}
!l1.isEmpty(),語意清晰。break 前移至 remove 後、索引運算前。(n + step - 1) % size 替代多行加減,消除邊界迴圈。