单向环形链表-约瑟夫问题(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}
相关文章
|
3月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
27 3
|
2月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
2月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
25 0
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
30 0
|
2月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
4月前
|
存储 Java
|
4月前
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
4月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
123 0
|
4月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
下一篇
DataWorks