约瑟夫问题java语言实现代码
来源:互联网 发布:优化系统设置的目的 编辑:程序博客网 时间:2024/04/30 05:30
import java.util.*;
/**
* 约瑟夫问题java语言实现代码
*
* @author 郁永生
*
*/
// 结点类的定义 每个人都是一个结点
class Node {
int data;// 存放数据
Node nextNode = null;// 下一个结点
// 构造方法
public Node(int data) {
this.data = data;
}
}
// 循环链表类的定义 n个人(n个结点构成一个循环链表)
class CircularList {
int n;// 链表结点数量
private Node firstNode = null;// 第一个人
private Node lastNode = null;// 最后一个人
int k = 1;
int m = 1;
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
public int getM() {
return m;
}
public void setM(int m) {
this.m = m;
}
public void createCircularList() {
Node tempNode = null;// 游标,标识当前链表最后一个人
for (int i = 1; i <= n; i++) {
if (i == 1) {// 对第一个人初始化
Node node = new Node(i);
firstNode = node;
tempNode = firstNode;// 游标最先指向第一个人
} else {
/*
* if (i != n) { Node node = new Node(i); tempNode.nextNode =
* node;// 末尾新加一个人 tempNode = tempNode.nextNode;//
* 更新tempNode指向新加的人(末尾的人) } else { Node node = new Node(i);
* tempNode.nextNode = node;// 末尾新加一个人 tempNode = node;
* tempNode.nextNode = firstNode;//
* 所有人员加入循环链表后,把最后一个人的下一结点指向第一个人 // 以使链表闭合为循环链表 }
*/
Node node = new Node(i);
tempNode.nextNode = node;// 末尾新加一个人
tempNode = tempNode.nextNode;// 更新tempNode指向新加的人(末尾的人)
}
}
tempNode.nextNode = firstNode;// 所有人员加入循环链表后,把最后一个人的下一结点指向第一个人
// 以使链表闭合为循环链表
lastNode = tempNode;
}
public void Josephu() {
// 找到第K个人
Node tempNode = firstNode;// 游标初始化为第一个人
Node tempPreNode = lastNode;// 游标初始化为最后一个人
for (int i = 1; i < k; i++) {
tempNode = tempNode.nextNode;
tempPreNode = tempPreNode.nextNode;
}// tempNode此时指向第k个人
// 开始报数
while (n!=1) {
for (int j = 1; j <m; j++) {
tempNode = tempNode.nextNode;
tempPreNode = tempPreNode.nextNode;
}
System.out.print(tempNode.data+" ");
// 此时要移除tempNode
// 只需要把tempNode前一个结点指向tempNode后一个结点tempNode.nextNode
// 关键是要找到tempNode前一个结点tempPreNode
tempPreNode.nextNode = tempNode.nextNode;
tempNode = tempNode.nextNode;
n--;
}
System.out.println();
System.out.print(tempNode.data+" 是最后的人 ");
}
// 打印循环链表
public void printCircularList() {
Node tempNode = firstNode;// 游标,标识当前要打印的人
do {
System.out.println("当前人员: " + tempNode.data);
tempNode = tempNode.nextNode;
} while (tempNode != firstNode);
}
}
public class Josephu {
/**
* @param args
*/
public static void main(String[] args) {
int n = 500;
int k = 2;
int m = 2;
CircularList cl = new CircularList();
cl.setN(n);
cl.setK(k);
cl.setM(m);
cl.createCircularList();
//cl.printCircularList();
cl.Josephu();
}
}
- 约瑟夫问题java语言实现代码
- 约瑟夫问题c、Java语言实现
- “约瑟夫问题”实现代码
- 约瑟夫问题Java代码
- 约瑟夫问题 java代码
- 约瑟夫问题 C语言代码
- java实现约瑟夫问题
- java实现约瑟夫问题
- 约瑟夫问题 java 实现
- Java实现约瑟夫问题
- 约瑟夫问题java实现
- 约瑟夫问题的代码实现
- 环形链表实现约瑟夫问题 java语言
- Java语言解决约瑟夫环问题(ArrayList实现)
- Java语言解决约瑟夫环问题(链表实现)
- 自己用java代码实现的:“约瑟夫”问题
- 约瑟夫环问题 java代码实现(高效率)
- 约瑟夫问题的JAVA实现
- IIS时间格式设置
- c++子类和父类成员函数重名
- 基于单元格的AOI(Area of Interest)算法简析
- log4j使用总结
- Xcode4字符串资源国际化for iOS
- 约瑟夫问题java语言实现代码
- 使用ADO对象向数据库添加数据
- AJAX - (转w3cschool)
- mfc wince 快捷键功能添加
- VS2010 vcpkgsrv.exe占用内存问题
- 兴奋:CSDN博客的速度变快了!
- 程序员技术练级攻略
- vi
- 看到一首喜欢的诗,转载如下: 你见,或者不见我 我就在那里