约瑟夫环
2015-12-16 17:41 tony4geek 阅读(257) 评论(0) 编辑 收藏 举报论坛里别人问的问题在此记录下来
已知n个人围坐在一张圆桌周围,从编号为1的人开始报数,数到m的那个人出列。下一个人从1开始报数,数到m的人继续出列,以此类推直至全部人出列。求出列顺序?
这个问题基于链表最通俗易懂,当然通过数组或者其他方式也可以实现。
Node.java
public class Node {
// 当前的索引
int data;
// 下一个节点
Node next;
Node(int i) {
this.data = i;
}
}
Main.java
public static void main(String[] args) {
//初始化第一个节点
Node first = new Node(1);
//第一个节点的下一个节点null
first.next = null;
//当前节点循环的时候判断
Node current = first;
//构造节点
for (int i = 2; i <= 50; i++) {
//从第2个节点开始模拟到50
Node temp = new Node(i);
temp.next = null;
//移动节点
current.next = temp;
current = temp;
}
//最后的一个节点和第一个首尾连接
current.next = first;
System.out.println("出列顺序为");
//判断是否只剩下最后一个
while (current != current.next) {
//循环报数1和2
for (int i = 1; i < 3; i++) {
//移动当前的节点
current = current.next;
}
//第一次循环current是第2个节点
System.out.print(current.next.data+" " );
//第一次循环current是第2个节点和第4个进行连接
current.next = current.next.next;
}
System.out.print("\n最后剩余" + current.data);
}