您的位置:首页 > 理论基础 > 数据结构算法

数据结构(一)循环链表 约瑟夫环

2015-12-18 22:56 239 查看
约瑟夫环:一共有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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: