java单项环形链表,优化约瑟夫环

package com.wql.www;

/*
*环形链表,看视频,单向的环形链表,只指定了下个节点,没有指定上个节点,
*所以每次都要循环找一次上个节点,然后自己优化了一下,解决每次循环找上个孩子节点
*/
public class ListChild {
 public static void main(String[] args){
  int len = 9; //设置孩子总数
  int k = 9;//设置从第几开始
  int m = 1209;//设置数几下
  MyList myList = new MyList();
  myList.setLen(len);
  myList.createList();
  myList.showList(); //查看当前孩子
  System.out.println("\n======开始游戏,一共 "+len+"个孩子=====");
  myList.setK(k); //设置从第几开始
  myList.setM(m);//设置数几下
  myList.playGame();
  //myList.showList();
  
 }
}
//节点
class ListObj{
 int sno = 0;
 ListObj nextObj= null;
 public void setSno(int sno){
  this.sno = sno;
 }
}
//环形链表
class MyList{
 int len = 0;
 int k = 1;//从第几开始数数
 int m = 1;//数几下
 ListObj firstObj = null;
 ListObj tempObj = null;
 ListObj tempObj2 = null;//定义一个引用,这个引用在删除孩子的时候保证在tempObj可以找到上个孩子
 public MyList(){}
 public void setLen(int len){
  this.len = len;
 }
 public void setK(int k){
  this.k = k;
 }
 public void setM(int m){
  this.m = m;
 }
 
 public void playGame(){
  
  init_delObj();
  
  int i = len;//控制变量
  while(i!=1){
   this.delObj();
   i--;
  }
  System.out.println("游戏结束,剩余孩子个数:"+i+",孩子编号:"+tempObj.sno);
 }
 
 //从第几个孩子开始
 public void init_delObj(){
  for(int i = 1;i <= k; i++){
   if(i == 1){
    tempObj = firstObj;
   }else{
    tempObj = tempObj.nextObj;
   }
  }
 }
 //删除孩子
 public void delObj(){
  
  System.out.println("从第"+tempObj.sno+"开始,数"+m+"下");
  //开始数数
  for(int i = 1 ;i <= m; i++){
   if(i ==1){
    tempObj2 = tempObj;
   }
   else{
    tempObj2 = tempObj;
    tempObj = tempObj.nextObj;
   }
  }
  System.out.print("删除编号"+tempObj.sno+"孩子,");
  System.out.println("上一个孩子编号是"+tempObj2.sno);
  
  //删除出局孩子
  tempObj2.nextObj = tempObj.nextObj;
  tempObj = tempObj.nextObj;
 }
 
 //创建环形链表
 public void createList(){
  for(int i = 1; i<= len; i++){
   if(i == 1){
    ListObj listObj = new ListObj();
    listObj.setSno(i);
    firstObj = listObj;
    tempObj = listObj; 
   }
   else if(i == len){
    ListObj listObj = new ListObj();
    listObj.setSno(i);
    tempObj.nextObj = listObj;
    listObj.nextObj = firstObj;
    tempObj = listObj;
    
   }
   else{
    ListObj listObj = new ListObj();
    listObj.setSno(i);
    tempObj.nextObj = listObj;
    tempObj = listObj;
   }
  }
 }
 
 public void showList(){
  ListObj showObj = firstObj;
  do{
   System.out.print(showObj.sno+" ");
   showObj = showObj.nextObj;
   
  }while(showObj !=  firstObj);
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iam傅红雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值