我的Java数据结构学习-4-5---单项环形链表(约瑟夫环)

 

 

 

约瑟夫节点对象:

package Demo1.LinkeList;

public class JosephuNode {

    //约瑟夫环路节点
    private int no;//编号
    private JosephuNode next;//指向下一个节点

    public JosephuNode(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

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

    public JosephuNode getNext() {
        return next;
    }

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

约瑟夫环形链表对象:

package Demo1.LinkeList;

public class JosephuLinkedList {
    //环形单项链表
    //创建一个第一个位置节点
    private JosephuNode fist = null;

    //添加节点到环形链表
    public void addJosephuLinkedNode(int nums) {
        if (nums < 1) {
            System.out.println("传入的节点数不正确。。");
            return;
        }
        JosephuNode temp = null;
        //使用for循环创建环形链表
        for (int i = 1; i <= nums; i++) {
            //根据编号创建节点
            JosephuNode node = new JosephuNode(i);
            //如果是第一个节点,他需要
            if (i == 1) {
                fist = node;
                fist.setNext(fist);//构成环
                temp = fist;//让指针指向第一个节点。
            } else {
                temp.setNext(node);
                node.setNext(fist);
                temp = node;
            }

        }
    }

    //遍历当前的环形链表
    public void printfJosephu() {
//判断链表是否为空
        if (fist == null) {
            System.out.println("没有任何节点");
            return;
        }
        JosephuNode temp = fist;
        while (true) {
            System.out.println("节点编号" + temp.getNo());
            if (temp.getNext() == fist) {
                //说明遍历完毕,
                break;
            }
            temp = temp.getNext();//指针后移
        }
    }

    //根据用户的输入,计算节点出去的顺序
    public void countJosephu(int startNum, int countNum, int nums) {
        //数据校验
        if (fist == null || startNum < 1 || startNum > nums) {
            System.out.println("参数输入有误,请仔细确认");
            return;
        }
        JosephuNode temp = fist;
        while (true) {
            if (temp.getNext() == fist) {
                break;
            }
            temp = temp.getNext();
        }
        for (int i = 0; i < startNum - 1; i++) {
            fist = fist.getNext();
            temp = temp.getNext();
        }
        while (true) {
            if (temp == fist) {
                //说明圈中只有一个系节点
                break;
            }
            for (int i = 0; i < countNum - 1; i++) {
                fist = fist.getNext();
                temp = temp.getNext();
            }
            System.out.println("出圈:"+fist.getNo());
            fist = fist.getNext();
            temp.setNext(fist);

        }
        System.out.println("最后留在圈中的编号:"+fist.getNo());
    }

}

约瑟夫环测试:

 

package Demo1.LinkeList;

public class JosephuLinkedListTest {
    public static void main(String[] args) {
        //测试约瑟夫
        JosephuLinkedList list = new JosephuLinkedList();
        list.addJosephuLinkedNode(5);//加入五个节点
        list.printfJosephu();
        //测试节点出圈是否正确
        list.countJosephu(1,2,5);

    }
}

 

posted on 2020-08-07 10:33  白嫖老郭  阅读(113)  评论(0)    收藏  举报

导航