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 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);
}
}
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);
}
}