数据结构(一)循环链表 约瑟夫环
2015-12-18 22:56
295 查看
约瑟夫环:一共有n个人,围成一个圈,从第1个人(k,这里讨论比较简单的k=1的情况)开始报数,号码为m的人出列,然后接着再重新开始报数,依旧是号码为m的人出列,以此类推..一直到最后一个人出列。
我感觉用循环链表比较容易实现,比较直观。
而循环链表跟普通单链表的区别就在于最后一个节点是否指向第一个节点,循环链表收尾相连。
在使用节点、链表等结构时,要自己写一个Node类,成员变量包括节点的值和指针域。
约瑟夫环代码分享:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.eva.practice.LinkedList.Node;
public class TestXunhuan {
static class Node { //节点类
int data;
Node next;
Node(int arg1) {
this.data = arg1;
}
}
public static void main(String[] args) {
//获取用户输入
Scanner input = new Scanner(System.in);
System.out.println("请输入总人数:");
int totalNum = input.nextInt();
System.out.println("请输入出圈的编号");
int outNum = input.nextInt();
List num = new ArrayList();
//初始化循环列表,头结点first和尾结点p
Node first = new Node(1);
first.next = first;
Node p = first;
for(int i=2; i<=totalNum; i++)
{
Node temp = new Node(i);
temp.next = p;
p.next = temp;
p = p.next;
}
p.next = first; //尾接头形成循环链表(p为尾结点)
//执行出圈操作
System.out.println("出圈顺序为:");
while(p != p.next)
{
//下面for循环后,p是第m个结点的前一个结点
for(int i=1; i<outNum; i++)
//删除第m个结点
p = p.next;
num.add(p.next.data+" ");
p.next = p.next.next;
}
//把集合里所有的值拼接成一个字符串
String result = "";
for(int j = 0;j < num.size();j++){
result += num.get(j);
}
System.out.println(result);
System.out.print("\n幸运者是:"+p.data);
}
}
我感觉用循环链表比较容易实现,比较直观。
而循环链表跟普通单链表的区别就在于最后一个节点是否指向第一个节点,循环链表收尾相连。
在使用节点、链表等结构时,要自己写一个Node类,成员变量包括节点的值和指针域。
约瑟夫环代码分享:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.eva.practice.LinkedList.Node;
public class TestXunhuan {
static class Node { //节点类
int data;
Node next;
Node(int arg1) {
this.data = arg1;
}
}
public static void main(String[] args) {
//获取用户输入
Scanner input = new Scanner(System.in);
System.out.println("请输入总人数:");
int totalNum = input.nextInt();
System.out.println("请输入出圈的编号");
int outNum = input.nextInt();
List num = new ArrayList();
//初始化循环列表,头结点first和尾结点p
Node first = new Node(1);
first.next = first;
Node p = first;
for(int i=2; i<=totalNum; i++)
{
Node temp = new Node(i);
temp.next = p;
p.next = temp;
p = p.next;
}
p.next = first; //尾接头形成循环链表(p为尾结点)
//执行出圈操作
System.out.println("出圈顺序为:");
while(p != p.next)
{
//下面for循环后,p是第m个结点的前一个结点
for(int i=1; i<outNum; i++)
//删除第m个结点
p = p.next;
num.add(p.next.data+" ");
p.next = p.next.next;
}
//把集合里所有的值拼接成一个字符串
String result = "";
for(int j = 0;j < num.size();j++){
result += num.get(j);
}
System.out.println(result);
System.out.print("\n幸运者是:"+p.data);
}
}
相关文章推荐
- 数据结构期末总结(对反转课堂的个人体会)
- <LeetCode OJ> 7. Reverse Integer
- 数据结构期末总结
- 数据结构 总结
- 数据结构学期总结
- 数据结构之shell排序
- 学期末数据结构之教程总结
- 2015年大二上-数据结构-数组与广义表(4)-广义表算法库及应用
- 第10周 数据结构实践项目——树和二叉树(1)【项目3 - 利用二叉树遍历思想解决问题 ]
- 说说翻转的数据结构课
- 第16周SHH数据结构-【项目1-验证算法(8)基数排序 】
- 第16周SHH数据结构-【项目1-验证算法(7)归并排序 】
- 第16周SHH数据结构-【项目1-验证算法(6)堆排序 】
- 第16周SHH数据结构-【项目1-验证算法(5)直接选择排序 】
- 第16周SHH数据结构-【项目1-验证算法(4)快速排序 】
- 第16周SHH数据结构-【项目1-验证算法(3)冒泡排序 】
- ffmpeg常用数据结构(转载)
- 数据结构学期末总结
- 数据结构与算法试题80道
- Python学习笔记——内置的数据结构