单向环形链表

单向环形链表

思路

  1. 创建孩子节点
    //孩子节点
    class Child{
        private int no;//节点编号
        private Child next;//节点指向域
    
        public Child(int no){
            this.no = no;
        }
    
        public int getNo() {
            return no;
        }
    
        public void setNo(int no) {
            this.no = no;
        }
    
        public Child getNext() {
            return next;
        }
    
        public void setNext(Child next) {
            this.next = next;
        }
    }
  1. 创建环形链表类,让first节点为空
    class CircleLinkedList{
        //创建first节点为空
        private Child first = null;
    }
  1. 添加节点到链表中
    1. nums为要添加节点的个数,进行判断
    2. 定义一个辅助变量curChild
    3. 刚开始环形链表中没有一个节点,对于第一个添加的节点比较特殊,先让节点first指向它,然后执行 first.setNext(first),就是让这一个节点指向自己,形成一个只有一个节点的环形链表,并让辅助变量curChild指向它
    4. 对接下来添加的节点,只需让辅助变量curChild指向它,再让该节点指向第一个节点first,就可完成节点添加的操作,最后让辅助变量curChild指向新添加进来的节点就可
    //添加孩子节点
        public void add(int nums){
            if (nums < 1){
                System.out.println("nums的值不正确!!!");
                return;
            }
            Child curChild = null;//辅助变量
            for (int i = 1; i <= nums; i++) {
                Child child = new Child(i);
                //第一个孩子节点
                if (i == 1){
                    first = child;
                    first.setNext(first);//构成环
                    curChild = first;//让curChild指向第一个小孩
                }else{
                    curChild.setNext(child);//指向新加入的孩子节点
                    child.setNext(first);//让新的孩子节点指向第一个孩子节点构成环
                    curChild = child;//让curChild指向新加入的节点
                }
            }
        }
  1. 遍历链表
    1. 定义辅助变量curChild指向first
    2. 输出curChild节点信息,curChild = curChild.getNext();接着遍历下一个节点
    3. 直到curChild.getNext() == first,这时已经遍历完链表,结束遍历
    //遍历环形链表
        public void show(){
            if (first == null){
                System.out.println("没有任何孩子节点!!!");
                return;
            }
            Child curChild = first;
            while(true){
                System.out.println("小孩节点:" + curChild.getNo());
                if (curChild.getNext() == first){
                    break;
                }
                curChild = curChild.getNext();
            }
        }
  1. 节点出圈
    1.startNo:表示从第几个节点开始
    countNum:表示每次数多少次
    nums:总共有多少个节点
    2. 先对参数进行判断
    3. 定义辅助变量helper指向链表最后一个节点(用循环完成操作)
    4. 接着需要让first节点指向第一个开始计数的节点,helper节点跟在后面,移动多少个取决于(startNo - 1)
    5. first移动到开始计数的节点后,让first移动到要出圈的那个节点,移动的次数取决于(countNum - 1),helper跟在first后面
    6. 将该节点输出,然后让first指向该出圈节点的下一个节点,让节点helper指向first节点,即可完成节点的出圈操作
    7. 最后helper == first时,链表中只剩最后一个节点,直接输出
    //孩子节点出圈
        public void get(int startNo,int countNum,int nums){
            if (startNo < 1 || startNo > nums || countNum < 1 ){
                System.out.println("输入的参数不正确!!!");
                return;
            }
            Child helper = first;
            //让辅助变量helper指向链表最后一个孩子节点
            while(true){
                if (helper.getNext() == first){
                    break;
                }
                helper = helper.getNext();
            }
            //startNo:表示从第几个节点开始计数
            //让first节点指向该节点,让helper节点跟在first后面一个节点
            for (int i = 0; i < startNo - 1; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            while (true){
                //此时链表中只剩一个孩子节点
                if (helper == first){
                    break;
                }
                //让first节点移动到要出圈的那个节点
                for (int i = 1; i <= countNum - 1; i++) {
                    first = first.getNext();
                    helper = helper.getNext();
                }
                System.out.println("孩子节点:" + first.getNo());
                //将first节点出圈
                first = first.getNext();
                helper.setNext(first);
            }
            //最后一个孩子节点
            System.out.println("最后的孩子节点:" + first.getNo());
        }

完整代码

    package LinkedList;
    
    /**
     * Created by lenovo on 2021/3/17.
     */
    public class CircleSingleLinkedList {
        public static void main(String[] args) {
           CircleLinkedList list = new CircleLinkedList();
           list.add(5);
           list.show();
    
           //测试节点出圈
            System.out.println("出圈顺序为:");
            list.get(1,2,5);
        }
    }
    
    class CircleLinkedList{
        //创建first节点为空
        private Child first = null;
        //添加孩子节点
        public void add(int nums){
            if (nums < 1){
                System.out.println("nums的值不正确!!!");
                return;
            }
            Child curChild = null;//辅助变量
            for (int i = 1; i <= nums; i++) {
                Child child = new Child(i);
                //第一个孩子节点
                if (i == 1){
                    first = child;
                    first.setNext(first);//构成环
                    curChild = first;//让curChild指向第一个小孩
                }else{
                    curChild.setNext(child);//指向新加入的孩子节点
                    child.setNext(first);//让新的孩子节点指向第一个孩子节点构成环
                    curChild = child;//让curChild指向新加入的节点
                }
            }
        }
    
        //遍历环形链表
        public void show(){
            if (first == null){
                System.out.println("没有任何孩子节点!!!");
                return;
            }
            Child curChild = first;
            while(true){
                System.out.println("小孩节点:" + curChild.getNo());
                if (curChild.getNext() == first){
                    break;
                }
                curChild = curChild.getNext();
            }
        }
    
        //孩子节点出圈
        public void get(int startNo,int countNum,int nums){
            if (startNo < 1 || startNo > nums || countNum < 1 ){
                System.out.println("输入的参数不正确!!!");
                return;
            }
            Child helper = first;
            //让辅助变量helper指向链表最后一个孩子节点
            while(true){
                if (helper.getNext() == first){
                    break;
                }
                helper = helper.getNext();
            }
            //startNo:表示从第几个节点开始计数
            //让first节点指向该节点,让helper节点跟在first后面一个节点
            for (int i = 0; i < startNo - 1; i++) {
                first = first.getNext();
                helper = helper.getNext();
            }
            while (true){
                //此时链表中只剩一个孩子节点
                if (helper == first){
                    break;
                }
                //让first节点移动到要出圈的那个节点
                for (int i = 1; i <= countNum - 1; i++) {
                    first = first.getNext();
                    helper = helper.getNext();
                }
                System.out.println("孩子节点:" + first.getNo());
                //将first节点出圈
                first = first.getNext();
                helper.setNext(first);
            }
            //最后一个孩子节点
            System.out.println("最后的孩子节点:" + first.getNo());
        }
    }
    
    //孩子节点
    class Child{
        private int no;//节点编号
        private Child next;//节点指向域
    
        public Child(int no){
            this.no = no;
        }
    
        public int getNo() {
            return no;
        }
    
        public void setNo(int no) {
            this.no = no;
        }
    
        public Child getNext() {
            return next;
        }
    
        public void setNext(Child next) {
            this.next = next;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值