package linkedlist;publicclassJosephu{publicstaticvoidmain(String[] args){//构建一个单向环形链表并输出
CircleSingleLinkedList circlesinglelinkedlist =newCircleSingleLinkedList();
circlesinglelinkedlist.addBoy(5);
circlesinglelinkedlist.showBoy();}}//创建一个环形的单向链表classCircleSingleLinkedList{//创建一个 first 指针,用于指向环形单向链表的第一个节点private Boy first =null;// first 自始至终都只能指向环形单向链表的第一个节点,不能动 //1. 添加 Boy 节点的方法,构成一个环形单向链表publicvoidaddBoy(int nums){//nums表示要创建的环形单向链表中节点的个数//(1) 先对 nums 做一个数据校验,因为个数至少得为1。如果1个都没有,那肯定不是环形单向链表了if(nums <1){
System.out.println(" nums 的值不正确");return;//结束方法}//(2) nums的值通过数据校验。由于节点个数已知为 nums ,因此使用 for 循环来创建环形单向链表
Boy curBoy =null;//辅助指针(引用变量),帮助构建环形链表for(int i =1; i <= nums; i++){// i 从1而不是0开始,是为了更方便计数//根据编号,创建 Boy 节点(因此 i 要从 1 而不是 0 开始)
Boy boy =newBoy(i);//如果创建的是第一个 Boy 节点if(i ==1){
first = boy;// first 是一个引用变量,不是节点(节点是对象)
first.setNext(first);//构成环形单向链表,只不过此时只有一个节点
curBoy = first;//让 curBoy 始终指向新添加的节点}else{//如果创建的不是第一个 Boy 节点
curBoy.setNext(boy);
boy.setNext(first);
curBoy = boy;//让 curBoy 始终指向新添加的节点}}}//2. 遍历环形单向链表的方法(输出 Boy 节点的 no 值)publicvoidshowBoy(){//(1) 首先判断环形单向链表是否为空if(first ==null){// first 始终指向环形单向链表的第一个节点,不能动
System.out.println("环形单向链表为空... ... ...");return;//结束方法}//(2) 环形单向链表不为空//由于 first 始终指向第一个节点,不能动,因此需要一个辅助指针(引用变量),帮助完成遍历
Boy curBoy = first;// 辅助指针 curBoy 用于遍历,初始值为指向第一个节点while(true){//<1> 先输出 no 值
System.out.printf("小孩子的编号为 %d\n", curBoy.getNo());//<2> 再判断 curBoy 是否已经指向最后一个节点if(curBoy.getNext()== first){break;}//<3> curBoy没有指向最后一个节点,将 curBoy 后移,继续遍历
curBoy = curBoy.getNext();}}}//创建一个Boy类,表示一个节点classBoy{private int no;//编号private Boy next;//指向下一个节点,默认为null//构造方法publicBoy(int no){this.no = no;}//由于 no 和 next 都是用 private 修饰,所以要定义设置和获得 no 和 next 的方法public int getNo(){return no;}publicvoidsetNo(int no){this.no = no;}public Boy getNext(){return next;}publicvoidsetNext(Boy next){this.next = next;}}