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

约瑟夫环:一共有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);  

}

}


转载于:https://my.oschina.net/u/2541938/blog/547605

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值