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

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

元素

 
/**
 * 环形链表节点
 */
public class CicleNode {
    private int no;
    private CicleNode next;
    public CicleNode(int no){
        this.no=no;
    }
 
    public int getNo() {
        return no;
    }
 
    public void setNo(int no) {
        this.no = no;
    }
 
    public CicleNode getNext() {
        return next;
    }
 
    public void setNext(CicleNode next) {
        this.next = next;
    }
 
    @Override
    public String toString() {
        return "CicleNode{" +
                "no=" + no +
                '}';
    }
}

单向环形列表

 
 
/**
 * 单向环形链表
 */
public class CicleSingleLinkedList {
    private CicleNode first;
 
    public CicleNode getFirst() {
        return first;
    }
 
    public void addNode(int nums) {
        if (nums < 1) {
            return;
        }
        //最后一个节点
        CicleNode cur = null;
        for (int i = 1; i <= nums; i++) {
            CicleNode temp = new CicleNode(i);
            if (i == 1) {
                first = temp;
                cur = first;
                continue;
            }
            //新增一个节点
            cur.setNext(temp);
            //重新标记最后一个节点
            cur = temp;
        }
        //最后一个节点指向第一个节点
        cur.setNext(first);
    }
 
    /**
     * 约瑟夫问题
     * 从第一节点开始数数,数到第num个节点,第num个打印,并且从链表删除
     *
     * @param num
     */
    public void go(int num) {
        if (first == null) {
            System.out.println("链表为空");
            return;
        }
        if (num < 1) {
            System.out.println("输入有误");
        }
        //初始化辅助元素,位于尾部,记录删除节点的前一个节点
        CicleNode tail = first;
        while (true) {
            if (tail.getNext() == first) {
                break;
            }
            tail = tail.getNext();
        }
 
        while (true) {
            //移动指针
            for (int i = 0; i < num - 1; i++) {
                tail = tail.getNext();
                first = first.getNext();
            }
            System.out.println(first);
            //重新链接环形链表
            first = first.getNext();
            tail.setNext(first);
            //链表只有一个元素
            if (first == tail) {
                System.out.println(first);
                break;
            }
        }
    }
 
    public void showLnkedList() {
        if (first == null) {
            System.out.println("链表为空");
            return;
        }
        CicleNode temp = first;
        while (true) {
            System.out.println(temp);
            temp = temp.getNext();
            if (temp == first) {
                break;
            }
        }
    }
}

测试

public class CicleSingleLinkedListDeno {
    public static void main(String[] args) {
        CicleSingleLinkedList list = new CicleSingleLinkedList();
        list.addNode(5);
        list.showLnkedList();
        System.out.println("");
        list.go(2);
    }
}
CicleNode{no=1}
CicleNode{no=2}
CicleNode{no=3}
CicleNode{no=4}
CicleNode{no=5}
 
CicleNode{no=2}
CicleNode{no=4}
CicleNode{no=1}
CicleNode{no=5}
CicleNode{no=3}
相关文章
|
11月前
|
存储 Python
Python 实现单向链表,和单向链表的反转
链表是一种数据结构,每个节点存储相邻节点的位置信息。单链表中的节点仅存储下一节点的位置。通过Python实现单链表,定义`ListNode`类并关联节点可创建链表。例如,创建A-&gt;B-&gt;C的链表后,可通过反转函数`reverse`将链表反转为CBA。代码展示了如何实现和操作单链表。
267 6
Python 实现单向链表,和单向链表的反转
|
存储 JavaScript 前端开发
JavaScript实现单向链表
JavaScript实现单向链表
307 109
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
106 3
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
138 1
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
209 1
|
存储 Java
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
260 0