zoukankan      html  css  js  c++  java
  • 每日一题 为了工作 2020 0321 第十九题

    /**
    * 题目:
    * 环形单链表约瑟夫问题
    * 据说著名犹太历史学家Josephus有过以下故事:在罗马人占领乔塔帕特后,39个犹太
    *入与 Josephus及他的朋友躲到一个洞中, 39个犹太人决定宁愿死也不要被敌人抓到,于是
    *决定了一个自杀方式,41个人排成一个圆圈,由第 1个人开始报数,报数到 3的人就自杀,
    *然后再由下一个人重新报 1, 报数到 3 的人再自杀, 这样依次下去, 直到剩下最后一个人
    *时, 那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环形链表
    *描述该结构并呈现整个自杀过程。
    * 要求:
    * 输入: 一个环形单向链表的头节点head和报数的值m。
    * 返回: 最后生存下来的节点, 且这个节点自己组成环形单向链表, 其他节点都删掉。
    * 分析:
    * 1.如果链表为空或者链表节点数为 1, 或者 m的值小于 1, 则不用调整就直接返回。
    * 2.在环形链表中遍历每个节点,不断转圈, 不断让每个节点报数。
    * 3.当报数到达 m时, 就删除当前报数的节点。
    * 4.删除节点后,别忘了还要把剩下的节点继续连成环状, 继续转圈报数, 继续删除。
    * 5.不停地删除, 直到环形链表中只剩一个节点, 过程结束。
    *
    * @author 雪瞳
    *
    */

    *代码

    public class Node {
    	public int value;
    	public Node next;
    	public Node(int data) {
    		this.value=data;
    	}
    }
    

      

    public class JosephusKill {
    	
    	private int count=0;
    	private Node last = null;
    	
    	public Node josehusListKill(Node head ,int m) {
    		
    		if(head.next == head || m<1 || head ==null) {
    			return head;
    		}
    		
    		//构造环形链表
    		last = head;
    		while(last.next != head) {
    			last = last.next;
    		}
    		
    		while(head != last) {
    			count++;
    			if(count == m) {
    				//删除节点
    				last.next=head.next;
    				count = 0;
    			}else {
    				last = last.next;
    			}
    			head = last.next;
    		}
    		
    		return head;
    	}	
    }
    

      

    import java.util.Random;
    import java.util.Scanner;
    
    public class TestJosephusKill {
    	public static void main(String[] args) {
    		JosephusKill kill = new JosephusKill();
    		TestJosephusKill test = new TestJosephusKill();
    		//获取初始信息
    		Random rand = new Random();	
    		Scanner sc = new Scanner(System.in);
    		System.out.println("请输入链表长度");
    		int K = sc.nextInt();
    		System.out.println("请输入报数的数值");
    		int m = sc.nextInt();
    
    		//随机生成链表
    		Node nodes[]=new Node[K];
    		for(int i=0;i<nodes.length;i++) {
    			nodes[i]=new Node(rand.nextInt(20)+1);
    		}
    		for(int i =0;i<nodes.length-1;i++) {
    			nodes[i].next=nodes[i+1];
    		}
    		nodes[nodes.length-1].next=nodes[0];
    		
    		Node head = nodes[0];
    		//test
    		test.showNode(head,K);
    		Node reverseNode = kill.josehusListKill(head, m);
    		test.showNode(reverseNode,1);
    		
    	}
    	public void showNode(Node head,int k) {
    		if(k==1) {
    			System.out.println("活下来的是: "+ head.value);
    		}else {
    			System.out.println("链表内的元素如下所示...");
    			int i = 0;
    			while(head != null) {
    				if(i==k) {
    					break;
    				}else {
    					i++;
    					System.out.print(head.value+"	");
    					head = head.next;
    				}
    
    			}
    			System.out.println();
    		}
    	}
    }
    

     

     

  • 相关阅读:
    制作软件说明书的图片编辑工具推荐PicPick
    浅谈配网供电可靠性及管理措施
    C#的winform中MDI 父窗体改变背景色
    Windows完成端口与Linux epoll技术简介
    django中的form表单
    调整图层初识3
    PS图层混合模式详解
    图层混合模式之正片叠底、滤色
    photoshop调整图层初识1
    调整图层初识2
  • 原文地址:https://www.cnblogs.com/walxt/p/12538949.html
Copyright © 2011-2022 走看看