

//小孩节点@Data@AllArgsConstructor@NoArgsConstructor@ToStringpublic 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);
}
}