目录
什么是环形链表
环形链表就是最后一个节点的next域指向了头结点的数据 从而形成了一个环本质其实还是单向链表
Josephu 问题
Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此 产生一个出队编号的序列。
提示:以下是本篇文章正文内容,下面案例可供参考
一、解决思路
添加元素
1.环形链表我们可以不用使用头结点
2.使用一个first记录一个数据对象
3.定义一个临时节点 保存frist节点
3.添加的数据的next要指向first
输出出列的数据
1.判断first节点是否为空
2.利用循环遍历步数 总步数少一步 因为在的那个节点也算一个数
3如果 现在已经走的步数+1 == 要走的步数 那么下一个节点就是要出列的数据 我们就使用first.next输出下一个节点
4.让first指向下一个节点
5.如果first和下一个节点节点相同 表示只剩最后一个数据了 那么break; 输出最后一个数据
二、使用步骤
1.添加数据
CircleNode first =new CircleNode();
public void add(int sum){
for (int i = 1; i <= sum; i++) {
CircleNode node = new CircleNode(i);
if (i==1){
first=node;
first.next=first;
}else {
CircleNode temp=first;
while (temp.next!=first){
temp=temp.next;
}
temp.next=node;
node.next=first;
temp=first;
}
}
}
2. 输出出列的数据
public void jj(int satr,int m){
while (first!=null){
for (int i = 1; i <m ; i++) {
if ((i+1)==m){
System.out.println(first.next);
first.next=first.next.next;
}
first = first.next;
}
if (first==first.next){
break;
}
}
System.out.println("最后出圈的小孩是:"+first);
}