![image.png](/uploads/projects/hemouren-bq2oh@mqh23y/cbfe05efeb95675ce7daed97711470b0.png)
![image.png](/uploads/projects/hemouren-bq2oh@mqh23y/e7ea1fc7b21419195fc9a03fe4d573ae.png)
//小孩节点
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Child {
//序号
private Integer no;
//下一个节点
private Child next;
public Child(Integer no) {
this.no = no;
}
}
//单向环形列表
public class SingleLinkedList {
private static Child first = new Child(1);
static {
first.setNext(first);
}
//添加小孩节点 , 构建环形列表
public void addChild(Integer newNo){addChildR(first,newNo);}
private void addChildR(Child child,Integer newNo){
if(child.getNo() == newNo){
System.out.println("编号重复");
return;
}
if(child.getNext().getNo() != first.getNo()){
addChildR(child.getNext(),newNo);
}else{
Child child1 = new Child(newNo);
child1.setNext(first);
child.setNext(child1);
}
}
//遍历
public void childList(){ childListR(first);}
private void childListR(Child child){
System.out.printf("编号: %d",child.getNo());
System.out.println();
if(child.getNext().getNo() != first.getNo()){
childListR(child.getNext());
}else{
return;
}
}
/**
* 数小孩 出圈
* @param starNo 表示从第几个小孩开始数
* @param countNum 表示数几下
*/
public void childCount(int starNo,int countNum){childCountR(getChild(starNo),countNum,0,getChild(childSum()));}
/**
*
* @param child
* @param countNum 需要数几下
* @param countNumnow 当前数了几次
*/
private void childCountR(Child child,int countNum,int countNumnow,Child pre){
if(countNum == countNumnow+1){
System.out.printf("编号: %d",child.getNo());
System.out.println();
//出圈
pre.setNext(child.getNext());
countNumnow = 0;
}else{
countNumnow++;
}
if(child.getNext().getNo() != child.getNo()){
childCountR(child.getNext(),countNum,countNumnow,child);
}else{
System.out.printf("编号: %d",child.getNext().getNo());
System.out.println();
}
}
public Child getChild(int counNum){ if(counNum<=0) counNum=1;return getChildR(first,counNum,1);}
/**
* 获取正数第 n 个小孩节点
* @param child
* @param counNum 需要数到第几个
* @param counNumNow 当前数到多少
* @return
*/
private Child getChildR(Child child,int counNum,int counNumNow){
if(counNum != counNumNow){
counNumNow++;
return getChildR(child.getNext(),counNum,counNumNow);
}else{
return child;
}
}
//获取总结点数量
public int childSum(){ return childSumR(first,1); }
private int childSumR(Child child,int count){
if(child.getNext().getNo() != first.getNo()){
count++;
return childSumR(child.getNext(),count);
}else{
return count;
}
}
}
public class Test {
public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addChild(2);
singleLinkedList.addChild(3);
singleLinkedList.addChild(4);
singleLinkedList.addChild(5);
singleLinkedList.addChild(6);
singleLinkedList.childList();
System.out.println("--------------------------");
singleLinkedList.childCount(1,2);
Child child = singleLinkedList.getChild(5);
}
}