public class CircleSingleLinkedList {
public static void main(String[] args) {
CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
circleSingleLinkedList.solveJosephus(25,1,2);
}
private Node headNode;
public class Node{
private int id;
private Node next;
public Node(){}
public Node(int id){
this.id = id;
}
}
public CircleSingleLinkedList(){
// headNode.next = headNode;
}
public void addNodes(int num){
if(num < 1){
System.out.println("添加节点数量不能小于1");
return;
}
for (int i = 1; i <= num ; i++) {
Node node = new Node(i);
if(i == 1){
headNode = node;
headNode.next = headNode;
}
else{
Node temp = headNode;
while(true){
if(temp.next == headNode){
temp.next = node;
node.next = headNode;
break;
}
temp = temp.next;
}
}
}
}
/**
* 下面这个方法解决约瑟夫问题
*/
public void solveJosephus(int nodeNum,int origin,int time){
if(origin < 1 || origin > nodeNum){
System.out.println("起点设置错误,请确认。");
return;
}
if(time < 1 ){
System.out.println("次数设置有误,请确认。");
return;
}
addNodes(nodeNum);
/**
* first 作为origin的起点指针
*/
Node first = headNode;
for (int i = 0; i < origin - 1; i++) {
first = first.next;
}
/**
* 因为是单链表,所以不能自己删除自己,temp应该要在first前一个位置,这个位置需要遍历找到
*/
Node temp = first;
while(true){
if(temp.next == first){
break;
}
temp = temp.next;
}
/**
* first要移动是因为每一次起点都要变成删除的节点的下一个。
*/
while(true){
if(temp == first){
System.out.printf("最后一个id是%d",temp.id);
break;
}
for (int i = 0; i < time - 1; i++) {
first = first.next;
temp = temp.next;
}
System.out.printf("结点已取出%d\n",first.id);
temp.next = temp.next.next;
first = first.next;
}
}
}
java josephus问题 环形单链表
最新推荐文章于 2024-05-31 10:46:10 发布