循环链表

1、循环链表

// 环形链表的节点信息
class Boy{

    private int no;   // 设置编号
    private Boy next;   // 指向下一个节点的指针

    //构造方法
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }

    //构造器
    public Boy(int no){
        this.no = no;
    }

    //重写方法
    public String toString(){
        return "[ no =" + no + " ]";
    }


}

2、增加链表中节点的数据

 public void addBoy(int nums){

        // 对人数是否大于1
        if(nums < 1){
            System.out.println("nums的值不正确");
            return;
        }
        Boy curBoy = null; // 辅助指针,帮助构建环形链表
        for(int i = 1;i <= nums;i++){
            Boy boy = new Boy(i);
            if(i == 1){
                first = boy;    // 将第一个小孩赋予头节点
                first.setNext(first);   // 将第一个小孩构成还,自己指向自己
                curBoy = first;      // 让curBoy指向第一个孩子
            }else{
                curBoy.setNext(boy);   // 设置curBoy的下一个结点为boy
                boy.setNext(first);    // 设置boy的下一个结点为头节点。
                curBoy = boy;          // 设置curBoy为boy。
            }
        }
    }

3、遍历循环链表

    // 遍历当前的环形链表
    public void showBoy(){
        // 判断链表是否为空
        if(first == null){
            System.out.println("没有任何小孩~~");
            return;
        }

        //因为头节点不能动,因此我们需要一个辅助指针
        Boy curBoy = first;
        while(true){
            System.out.printf("小孩的编号 %d\n",curBoy.getNo());
            if (curBoy.getNext() == first){   // 说明已经遍历完成
                break;
            }
            curBoy = curBoy.getNext();   // curBoy 后移
        }
    }

4、删除循环链表中的节点信息

    //根据用户的输入,计算出小孩出圈的顺序

    /**
     *
     * @param startNo  表示从第几个开始数数
     * @param countNum  表示数几下
     * @param nums  表示最初有多少小孩子在圈内
     */
    public void countBoy(int startNo,int countNum,int nums){
        // 判断队列是否为空,开始位置要不能为小于1,或者大于总体的数量
        if(first == null || startNo < 1 || startNo > nums){
            System.out.println("参数有误,请重新输入");
            return;
        }
        // 创建辅助指针,帮助完成小孩出圈
        Boy heaper = first;
        while(heaper.getNext() != first){   // 当前的节点的下一个指针不能为队头
            heaper = heaper.getNext();      // heap指向最后一个节点
        }
        // 小孩报数前,先让first和heaper移动 k-1 次;
        for(int j = 0; j < startNo - 1; j++){
            first = first.getNext();
            heaper = heaper.getNext();
        }
        // 小孩报数时,让first和heaper指针同时移动m-1次,然后出圈。
        // 当一个圈内只剩下一个节点时,跳出循环
        while(heaper != first){
            for(int j = 0; j < countNum-1; j++){
                first = first.getNext();
                heaper = heaper.getNext();
            }
            System.out.printf("小孩%d 出圈\n",first.getNo());
            first = first.getNext();    // 将first的next的地址赋予first,使得first指向原先first的next节点
            heaper.setNext(first);      // 将heaper的next赋值为first。
        }
        System.out.printf("最后留在圈中的小孩编号为%d\n",first.getNo());
    }

5、全部代码:

package com.CircleLinkedList;

public class CircleSingleLinkedListDemo {
    public static void main(String[] args){
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoy(5);
        circleSingleLinkedList.showBoy();
        circleSingleLinkedList.countBoy(1,2,5);
    }
}

class CircleSingleLinkedList{
    // 创建一个first节点,当前没有编号
    private Boy first = null;

    // 添加节点信息构成一个环形链表
    // nums :Boy的数量
    public void addBoy(int nums){

        // 对人数是否大于1
        if(nums < 1){
            System.out.println("nums的值不正确");
            return;
        }
        Boy curBoy = null; // 辅助指针,帮助构建环形链表
        for(int i = 1;i <= nums;i++){
            Boy boy = new Boy(i);
            if(i == 1){
                first = boy;    // 将第一个小孩赋予头节点
                first.setNext(first);   // 将第一个小孩构成还,自己指向自己
                curBoy = first;      // 让curBoy指向第一个孩子
            }else{
                curBoy.setNext(boy);   // 设置curBoy的下一个结点为boy
                boy.setNext(first);    // 设置boy的下一个结点为头节点。
                curBoy = boy;          // 设置curBoy为boy。
            }
        }
    }

    // 遍历当前的环形链表
    public void showBoy(){
        // 判断链表是否为空
        if(first == null){
            System.out.println("没有任何小孩~~");
            return;
        }

        //因为头节点不能动,因此我们需要一个辅助指针
        Boy curBoy = first;
        while(true){
            System.out.printf("小孩的编号 %d\n",curBoy.getNo());
            if (curBoy.getNext() == first){   // 说明已经遍历完成
                break;
            }
            curBoy = curBoy.getNext();   // curBoy 后移
        }
    }

    //根据用户的输入,计算出小孩出圈的顺序

    /**
     *
     * @param startNo  表示从第几个开始数数
     * @param countNum  表示数几下
     * @param nums  表示最初有多少小孩子在圈内
     */
    public void countBoy(int startNo,int countNum,int nums){
        // 判断队列是否为空,开始位置要不能为小于1,或者大于总体的数量
        if(first == null || startNo < 1 || startNo > nums){
            System.out.println("参数有误,请重新输入");
            return;
        }
        // 创建辅助指针,帮助完成小孩出圈
        Boy heaper = first;
        while(heaper.getNext() != first){   // 当前的节点的下一个指针不能为队头
            heaper = heaper.getNext();      // heap指向最后一个节点
        }
        // 小孩报数前,先让first和heaper移动 k-1 次;
        for(int j = 0; j < startNo - 1; j++){
            first = first.getNext();
            heaper = heaper.getNext();
        }
        // 小孩报数时,让first和heaper指针同时移动m-1次,然后出圈。
        // 当一个圈内只剩下一个节点时,跳出循环
        while(heaper != first){
            for(int j = 0; j < countNum-1; j++){
                first = first.getNext();
                heaper = heaper.getNext();
            }
            System.out.printf("小孩%d 出圈\n",first.getNo());
            first = first.getNext();    // 将first的next的地址赋予first,使得first指向原先first的next节点
            heaper.setNext(first);      // 将heaper的next赋值为first。
        }
        System.out.printf("最后留在圈中的小孩编号为%d\n",first.getNo());
    }
}

// 环形链表的节点信息
class Boy{

    private int no;   // 设置编号
    private Boy next;   // 指向下一个节点的指针

    //构造方法
    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }

    //构造器
    public Boy(int no){
        this.no = no;
    }

    //重写方法
    public String toString(){
        return "[ no =" + no + " ]";
    }


}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值