Day557.单向环形链表 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day557.单向环形链表 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

单向环形链表

一、约瑟夫问题

二、单向环形链表图示


三、构建和遍历的代码实现

package com.achang.linkedlist;

/**
 * @Author Achang
 * @Date 2022/3/12 15:17
 * 约瑟夫问题
 **/
public class Josepfu 

    public static void main(String[] args) 
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoy(25);

        circleSingleLinkedList.list();

    



//环形单线链表
class CircleSingleLinkedList
    //first节点
    private Boy first = new Boy(-1);

    //添加节点,构成环形链表
    public void addBoy(int nums)
        //nums数据校验
        if (nums < 1)
            System.out.println("nums值要求大于1");
            return;
        

        Boy curNode = null;//辅助节点,当前位置
        //使用for循环创建环形链表
        for (int i = 1; i <= nums; i++) 
            //根据编号,创建小孩节点
            Boy boy = new Boy(i);
            if (i==1)//如果是第一个节点
                first = boy;
                first.setNext(first);//构成一个环状
                curNode = first;//
            else 
                curNode.setNext(boy);
                boy.setNext(first);
                curNode = boy;//后移
            
        
    

    //遍历环形链表
    public void list()
        if (first.getNext()==null)
            System.out.println("链表为空");
            return;
        

        Boy curNode = first;
        while (true)
            System.out.println(curNode.getNo());
            if (curNode.getNext() == first)
                break;
            
            curNode = curNode.getNext();
        

    



//节点
class Boy
    private int no;//编号
    private Boy next;//下一个节点
    public Boy(int no)
        this.no = no;
    

    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;
    



四、约瑟夫问题的出队方式实现

/**
     * 出队
     * @param startNo 从第几个小孩开始数
     * @param countNum 数几次
     * @param nums 初始时总共几个小孩
     */
    public void push(int startNo,int countNum,int nums)
        if (first.getNext() == null || startNo < 1 || startNo > nums)
            System.out.println("不合法状态");
            return;
        
        //创建辅助指针,帮助小孩出队
        Boy helper = first;
        while (true)
            //说明指向最后一个节点
            if (helper.getNext() == first)
                break;
            
            helper = helper.getNext();
        
        //移动位置
        for (int i = 0; i < startNo - 1; i++) 
            first = first.getNext();
            helper = helper.getNext();
        
        //出队
        while (true)
            if (helper == first)//说明圈中只有一个
                break;
            
            for (int i = 0; i < countNum - 1; i++) 
                first = first.getNext();
                helper = helper.getNext();
            
            //这是first指向的节点,就是要出队的节点
            System.out.println("出队了:"+first.getNo());
            //队列删除出队
            first = first.getNext();
            helper.setNext(first);
        
        System.out.println("最后留在圈中的小孩为:"+first.getNo());
    
    public static void main(String[] args) 
        CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList();
        circleSingleLinkedList.addBoy(5);

        circleSingleLinkedList.push(1,2,5);
    


以上是关于Day557.单向环形链表 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

单向环形链表

简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

:链表 -- 单向环形链表约瑟夫问题(约瑟夫环)

07 - 单向环形链表应用场景 —— Josephu问题

约瑟夫问题Java环形单向链表代码实现

Day6 环形链表 II 买卖股票的最佳时机 不同路径