美文网首页
循环链表求解Josephu环

循环链表求解Josephu环

作者: YAOPRINCESS | 来源:发表于2020-07-03 16:58 被阅读0次

规则

1<=m<=n

结果

image.png

完整测试代码

package com.nan;

import java.util.Queue;

/**
 * @author klr
 * @create 2020-07-03-15:37
 */

public class JosephuDemo {
    public static void main(String[] args) {
        Josephu j = new Josephu();
        Node n1 = new Node(1);
        Node n2 = new Node(2);
        Node n3 = new Node(3);
        Node n4 = new Node(4);
        Node n5 = new Node(5);
        Node n6 = new Node(6);
        Node n7 = new Node(7);
        Node n8 = new Node(8);

        j.add(n1);
        j.add(n2);
        j.add(n3);
        j.add(n4);
        j.add(n5);
        j.add(n6);
        j.add(n7);
        j.add(n8);

        j.show(3,j.getNumber());
    }


}

//单向环形链表求解约瑟夫环
class Josephu{
    //不带头结点
    private Node head = null;

    public void add(Node node) {

        if (head == null) {
            head = node;
            return;
        }

        Node temp = head;
        while (temp.next!=null) {
            temp = temp.next;
        }
        temp.next = node;
    }

    public void show(int m,int n){
        if (head == null) {
            System.out.println("环不存在");
            return;
        }
        //把单链表编程环表链表
        Node ring=head;
        while (true) {
            if (ring.next == null) {
                ring.next=head;
                break;
            }
            ring = ring.next;
        }
        int[] list = new int[n];
        int count = 1;
        int index = 0;
        Node temp = head;
        Node next = head;
        Node pre=head;
        while (n > 0) {
            if (n == 1) {
                list[index]=temp.number;
                n--;
                break;
            }
            if (count == m) {
                list[index++]=temp.number;
                next = temp.next;
                //把它从单链表中删去
                delete(temp.number,pre);
                //重新计数
                count=1;
                temp = next;
                n--;
            }
            else {
                count++;
                pre=temp;
                temp = temp.next;
            }
        }
        for (int i : list) {
            System.out.println(i);
        }
    }

    //删除结点
    public void delete(int number,Node indecate) {
        Node temp = indecate;
        if (temp == null) {
            System.out.println("该链表为空");
            return;
        }
        boolean flag = false;
        while (true) {
            if (temp.next== null) {
                break;//遍历完链表
            }
            if (temp.next.number == number) {
                flag =  true;//找到结点
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            temp.next=temp.next.next;
        }
        else {
            System.out.printf("编号%d不存在",number);
        }
    }
    public int getNumber(){
        if (head == null) {
            return 0;
        }
        int count=0;
        Node temp = head;
        while (temp != null) {
            count++;
            temp=temp.next;
        }
        return count;
    }

    public Node getHead() {
        return head;
    }
}

class Node{
    public int number;
    public String description;
    public Node next;

    public Node(int number) {
        this.number = number;
    }

    public Node(int number, String description) {
        this.number = number;
        this.description = description;
    }

    @Override
    public String toString() {
        return "Node{" +
                "number=" + number +
                ", description='" + description + '\'' +
                '}';
    }
}

相关文章

  • 循环链表求解Josephu环

    规则 1<=m<=n 结果 完整测试代码

  • 算法面经---单向循环链表(解决约瑟夫问题)

    单向循环链表--解决约瑟夫问题 一、单向循环链表的应用场景 1.1 问题描述 Josephu(约瑟夫、约瑟夫环) ...

  • 单项环形链表介绍和约瑟夫问题

    单项环形链表介绍和约瑟夫问题 1.单项环形链表图解 2.Josephu(约瑟夫)问题 Josephu 问题为:设...

  • 数据结构与算法整理

    (1)链表的技巧 快慢指针(找环,环入口,环长度) 双指针(倒数K个节点) 合并链表(递归求解) 约瑟夫环(环形链...

  • 学习数据结构第一弹 线性表(5)

    循环链表与双向链表 循环链表: 循环链表也是一种线性表的链式存储结构,其实他和单链表很像,其特点是它是一个环,也就...

  • 单向循环链表

    单向循环链表 循环链表顾名思义就是链表是循环的,最后一个节点的next指向首元节点,从而形成一个环.如图 单向循环...

  • 线性表(四)——循环链表

    循环链表 构造原理 循环链表是指链表中最后那个链结点的指针域存放指向链表最前面那个结点的指针,整个链表形成一个环。...

  • 链表的操作和算法相关

    github->demo1、创建(单链表、双链表、循环链表)2、翻转单链表(递归和非递归)3、判断链表是否存在环。...

  • 算法面试:链表环的检测

    在有关链表的面试算法题中,检测链表是否有环是常见的题目。 给定一个链表,要求你判断链表是否存在循环,如果有,给出环...

  • 判断单链表是否有环及寻找环的

    若单链表中存在环,则环肯定在单链表的尾部,如果通过一个指针遍历单链表,最终这个指针会在单链表尾部的环中不断循环,其...

网友评论

      本文标题:循环链表求解Josephu环

      本文链接:https://www.haomeiwen.com/subject/plasqktx.html