java基于双向环形链表解决丢手帕问题的方法示例

 更新时间:2017年11月07日 12:21:14   作者:逐兔郎  
这篇文章主要介绍了java基于双向环形链表解决丢手帕问题的方法,简单描述了丢手帕问题,并结合实例形式给出了Java基于双向环形链表解决丢手帕问题的步骤与相关操作技巧,需要的朋友可以参考下

本文实例讲述了java基于双向环形链表解决丢手帕问题的方法。分享给大家供大家参考,具体如下:

问题:设编号为1、2……n的几个小孩围坐一圈,约定编号为k(1=<k<=n)的小孩从1开始报数,数到m的那个出列,他的下一位又从1开始报数,数到m的那个人又出列,直到所有人出列为止,由此产生一个出队编号的序列。

我们现在用一个双向环形链表来解这一问题。先来看看下面这幅图:

圆圈代表一个结点,红色的指针指向下一个元素,紫色的指针指向上一个元素。first指针指向第一个元素,表明第一个元素的位置,cursor是游标指针,它的作用重大。那么这个环形的链表就可以模拟小孩排成的圆圈,下面是具体的代码:

public class Test {
  public static void main(String[] args){
      CycleLink cl=new CycleLink(5); //构造环形链表
      System.out.println("脚本之家测试结果:");
      cl.print();
      cl.setK(2); //设置从第几个小孩开始数数
      cl.setM(3); //设置数几下
      cl.play(); //开始游戏
  }
}
class Child{
  int no;
  Child nextChild;
  Child previousChild;
  public Child(int no){
    this.no=no;
  }
}
class CycleLink{
  Child first;
  Child cursor;
  int length;
  //从第几个小孩开始数
  private int k=1;
  //数几下
  private int m=1;
  //构造函数
  public CycleLink(int len){
    this.length=len;
    for(int i=1;i<=length;i++){
      Child ch=new Child(i);
      if(i==1){
        first=ch;
        cursor=ch;
      }else if(i<length){
        cursor.nextChild=ch;
        ch.previousChild=cursor;
        cursor=ch;
      }else {
        cursor.nextChild=ch;
        ch.previousChild=cursor;
        cursor=ch;
        ch.nextChild=first;
        first.previousChild=ch;
      }
    }
  }
  //打印链表
  public void print(){
    cursor=first;
    do{
      System.out.print(cursor.no+"<<");
      cursor=cursor.nextChild;
    }while(cursor!=first);
    System.out.println();
  }
  //开始游戏
  public void play(){
    Child temp;
    cursor=first;
    //先找到第k个小孩
    while(cursor.no<k){
      cursor=cursor.nextChild;
    }
    while(length>1){
      //数m下
      for(int i=1;i<m;i++){
        cursor=cursor.nextChild;
      }
      System.out.println("小孩"+cursor.no+"出局了!");
      //找到前一个小孩
      temp=cursor.previousChild;
//     temp=cursor;
//     do{
//       temp=temp.nextChild;
//     }while(temp.nextChild!=cursor);
      temp.nextChild=cursor.nextChild;
      cursor.nextChild.previousChild=temp;
      cursor=cursor.nextChild;
      length--;
    }
    System.out.println("最后一个出局的小孩是"+cursor.no);
  }
  public void setK(int k) {
    this.k = k;
  }
  public void setM(int m) {
    this.m = m;
  }
}

这个代码的基本框架是根据韩顺平的视频的。不过他用的是一个单向的链表,上面的代码注释的部分是用来找cursor所指向的元素的上一个元素的,是将整个链表转了一圈来实现的。这里我改成了双向链表,直接用一个cursor.previousChild就可以了。

运行结果:

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java包装类之自动装箱与拆箱

    Java包装类之自动装箱与拆箱

    这篇文章主要介绍了Java包装类之自动装箱与拆箱,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java面试题之HashSet的实现原理

    Java面试题之HashSet的实现原理

    这篇文章主要介绍了Java面试题之HashSet的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 关于Java多线程上下文切换的总结

    关于Java多线程上下文切换的总结

    CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换,需要的朋友可以参考下
    2023-05-05
  • Java中通过sftp协议实现上传下载的示例代码

    Java中通过sftp协议实现上传下载的示例代码

    在java开发中遇到需要将linux系统中指定目录下的文件下载到windows本地的需求,本文就来介绍Java中通过sftp协议实现上传下载,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • springboot项目如何引用公共模块的bean

    springboot项目如何引用公共模块的bean

    这篇文章主要介绍了springboot项目如何引用公共模块的bean问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Spring boot的上传图片功能实例详解

    Spring boot的上传图片功能实例详解

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要介绍了Spring boot 上传图片,需要的朋友可以参考下
    2018-03-03
  • Springboot发送post请求的几种方式总结

    Springboot发送post请求的几种方式总结

    这篇文章主要为大家详细介绍了Springboot发送post请求的几种方式,文中的示例代码讲解详细,对我们学习或工作有一定的帮助,感兴趣的小伙伴可以了解一下
    2024-01-01
  • Java 工具类实现音频音量提升

    Java 工具类实现音频音量提升

    本文主要介绍了可以将音频提升音量的一个java工具类示例代码,代码具有一定的学习价值,感兴趣的小伙伴来了解一下吧,,希望能够给你带来帮助
    2021-11-11
  • 微信小程序调用微信登陆获取openid及java做为服务端示例

    微信小程序调用微信登陆获取openid及java做为服务端示例

    这篇文章主要介绍了微信小程序调用微信登陆获取openid及java做为服务端示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java启动线程的3种方式对比分析

    java启动线程的3种方式对比分析

    这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论