package org.structure.linkedList;
/**
* 约瑟夫问题
* @author cjj_1
* @date 2020-08-04 17:35
*/
public class SingleCircleLinkedListDemo {
public static void main(String[] args) {
SingleCircleDemo node1 = new SingleCircleDemo(1,"鲁智深","鲁达");
SingleCircleDemo node4 = new SingleCircleDemo(4,"王五","55");
SingleCircleDemo node2 = new SingleCircleDemo(2,"张三","ss");
SingleCircleDemo node3 = new SingleCircleDemo(3,"李四","44");
SingleCircleDemo node5 = new SingleCircleDemo(5,"吴六","66");
SingleCircleLinkedList list = new SingleCircleLinkedList();
// list.add(node1);
// list.add(node3);
// list.add(node2);
// list.add(node4);
// list.add(node5);
list.yuesefu(2,2,30);
}
}
class SingleCircleLinkedList{
SingleCircleDemo yusef ;
// //第m个出列
// int m ;
// public SingleCircleLinkedList(int m){
// this.m = m;
// }
/**
* 增加节点,形成环状
* @param node
*/
public void add(SingleCircleDemo node){
//环形链表
if(yusef==null){
yusef = node;
yusef.next = yusef;
return;
}
SingleCircleDemo temp = yusef;
//找到最后一个节点
while (temp.next != yusef)
temp = temp.next;
temp.next=node;
node.next = yusef;
}
/**
* 增加sum个节点,形成环状
* @param sum
*/
public void add(int sum){
int i=0;
if(sum<1)
return;
SingleCircleDemo temp = null;
while (i<=sum-2){
if(yusef==null){
yusef = new SingleCircleDemo(i,String.valueOf(i),String.valueOf(i));
yusef.next = yusef;
temp = yusef;
}else {
temp.next =new SingleCircleDemo(i,String.valueOf(i),String.valueOf(i));
temp = temp.next;
}
i++;
}
temp.next = new SingleCircleDemo(i,String.valueOf(sum-1),String.valueOf(sum-1));
temp.next.next = yusef;
}
//第m个出队
public void yuesefu(int m){
if(yusef == null)
return;
int num = 0;
//第一个节点
SingleCircleDemo first = yusef;
SingleCircleDemo helper = first.next;
while (first != null){
if(num==(m-1)){
//回收helper
System.out.println(num +":"+ helper.toString());
if(helper == first){
first =null;
break;
}
first.next = helper.next;
first = helper.next;
helper = first.next;
num =0;
}else {
first = helper;
helper = helper.next;
num++;
}
}
}
/**
* 约瑟夫升级版本(指定开始编号,指定总的)
* @param startno 开始计数的num
* @param countmum 计数num
* @param sumnum 总共的num
*/
public void yuesefu(int startno,int countmum,int sumnum){
add(sumnum);
if(yusef == null)
return;
if(startno <= 0 || startno > sumnum || countmum<=0)
return;
//定义两个指针变量
SingleCircleDemo first = yusef;
SingleCircleDemo helper = first;
//复制helper 为 队列中的最后一个节点
while (first != helper.next){
helper = helper.next;
}
//startno开始数,让first指向第startno个节点
for(int i =0;i<startno-1;i++){
first = first.next;
helper = helper.next;
}
//第countnum个出队
int num = 0;
//第一个节点
while (first != null){
if(num==(countmum-1)){
//回收helper
System.out.println(num +":"+ helper.toString());
if(helper == first){
first =null;
break;
}
helper.next = first.next;
first = helper.next;
num =0;
}else {
first = first.next;
helper = helper.next;
num++;
}
}
}
}
class SingleCircleDemo{
int no;
String name;
String nickName;
SingleCircleDemo next;
public SingleCircleDemo(int no,String name,String nickName){
this.no =no;
this.nickName = nickName;
}
@Override
public String toString() {
return "SingleCircleDemo{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
算法-约瑟夫问题
最新推荐文章于 2024-05-30 13:37:12 发布