JAVA实现魔术师发牌问题

魔术师发牌问题:


 问题名称:魔术师发牌问题
 问题描述:魔术师手里一共有13张牌,全是黑桃,1~13.
 魔术师需要实现一个魔术:这是十三张牌全部放在桌面上(正面向下),
 第一次摸出第一张,是1,翻过来放在桌面上。
 第二次摸出从上往下数第二张,是2,翻过来 放在桌面上,(第一张放在最下面去,等会儿再摸),
 第三次摸出从上往下数第三张,是3,翻过来放在桌面上,(第一张和第二张 放在最下面去,等会儿再摸)
 以此类推 最后一张就是13
 
  方法:
  1、创建一个长度为13的单向循环链表,链表中值全部存0
  2、遍历链表进行修改值

JAVA代码实现:

package com.briup.Study;

public class MagicPoker {
	//定义链表的头节点
	private Node head;
	//成员内部类Node来实现链表
	class Node {
		private Integer date;
		private Node next;
		public Node() {}
		public Node(Integer date) {
			this(date,null);
		}
		public Node(Integer date, Node next) {
			this.date = date;
			this.next = next;
		}
		public Integer getDate() {
			return date;
		}
		public void setDate(Integer date) {
			this.date = date;
		}
		public Node getNext() {
			return next;
		}
		public void setNext(Node next) {
			this.next = next;
		}		
	}
	/*构造函数中直接初始化长度为13的循环链表
	 * 第一个节点的值默认为1*/
	public MagicPoker() {
		head = new Node(1);
		Node p = head;
		int i=1;
		while(p.next==null&&i<13) {
			Node nextNode = new Node(0);
			p.next = nextNode;
			p = p.next;
			i++;
		}
		//构建循环链表
		p.next = head;
	}
	//打印循环链表
	public void myPrint() {
		Node p = head;
		for(int i=0;i<13;i++) {
			System.out.print(p.date+" ");
			p = p.next;
		}		
	}	
	//循环修改节点值(核心代码)
	public void magic() {
		//指针p指向head用来控制每次指针移动的下一个位置
		Node p = head;
		//从2开始存到13
		for(int i=2;i<=13;i++) {
			for(int j=0;j<i;j++) {
				p = p.next;
				//如果已经有牌,跳过
				if(p.date!=0) {
					j--;
				}
			}
			p.date=i;
		}
	}
	public static void main(String[] args) {
		MagicPoker magic = new MagicPoker();
		magic.myPrint();
		magic.magic();
		System.out.println();
		magic.myPrint();
	}
}

打印结果:

1 0 0 0 0 0 0 0 0 0 0 0 0

1 8 2 5 10 3 12 11 9 4 7 6 13

    原文作者:魔术师发牌问题
    原文地址: https://blog.csdn.net/yang505581644/article/details/78878809
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞