魔术师发牌问题java双向循环链表实现

魔术师发牌问题,java双向循环链表实现

魔术师发牌问题的简介:一位魔术师掏出一叠扑克牌,魔术师取出其中13张黑桃,洗好后,把牌面朝下。说:“我不看牌,只数一数就能知道每张牌是什么?”魔术师口中念一,将第一张牌翻过来看正好是A;魔术师将黑桃A放到桌上,继续数手里的余牌,第二次数1,2,将第一张牌放到这叠牌的下面,将第二张牌翻开,正好是黑桃2,也把它放在桌子上。第三次数1,2,3,前面二张牌放到这叠牌的下面,取出第三张牌,正好是黑桃3,这样依次将13张牌翻出,全部都准确无误。求解:魔术师手中牌的原始顺序是什么样子的?

用到的类:结点类,用于创建结点,链表的初始化和保存牌序。

/**
 * @ClassName: Node
 * @Description 本类功能:结点类,用于链表的初始化以及创建结点
 * @Author lzl
 * @Date 2020.10.04
 * @Time 14:52
 */

public class Node < T > {
    private T data;
    private Node < T > prior;
    private Node < T > next;

    public Node ( T data , Node < T > prior , Node < T > next ) {
        this.data = data;
        this.prior = prior;
        this.next = next;
    }

    public T getData ( ) {
        return data;
    }

    public void setData ( T data ) {
        this.data = data;
    }

    public Node < T > getPrior ( ) {
        return prior;
    }

    public void setPrior ( Node < T > prior ) {
        this.prior = prior;
    }

    public Node < T > getNext ( ) {
        return next;
    }

    public void setNext ( Node < T > next ) {
        this.next = next;
    }

    public Node ( ) {
    }
}

魔术师发牌类,解决魔术师发牌问题:

/**
 * @ClassName: MagicProblem
 * @Description 本类功能:解决魔术师发牌问题
 * @Author lzl
 * @Date 2020.10.04
 * @Time 15:19
 */

public class MagicProblem {
    public static void main ( String[] args ) {
        Node < Integer > head = new Node <> ();
        init ( head , 13 );//初始化
        licensing ( head );//设置牌序
        cardOrder ( head );//输出牌序
    }

    private static void cardOrder ( Node < Integer > head ) {
        String[] poker = new String[] { "♠A" , "♠2" , "♠3" , "♠4" , "♠5" , "♠6" , "♠7" , "♠8" , "♠9" , "♠10" , "♠J" , "♠Q" , "♠K" , };
        Node < Integer > temp;
        for ( temp = head.getNext (); temp.getNext () != head.getNext () ; temp = temp.getNext () ) {
            System.out.print ( poker[ temp.getData () - 1 ] + "-->" );
        }
        System.out.println ( poker[ temp.getData () - 1 ] );

    }

    private static void licensing ( Node < Integer > head ) {
        head.getNext ().setData ( 1 );
        int count = 2;
        Node < Integer > temp = head.getNext ();
        while ( true ) {
            for ( int i = 0 ; i < count ; i++ ) {
                temp = temp.getNext ();
                if ( temp.getData () != 0 ) {
                    temp = temp.getNext ();
                    i--;
                }
            }

            if ( temp.getData () == 0 ) {
                temp.setData ( count );
                count++;
            }
            if ( count == 14 ) {
                break;
            }
        }
    }

    private static void init ( Node < Integer > head , int num ) {
        Node < Integer > first = new Node <> ();
        head.setNext ( first );
        first.setData ( 0 );
        first.setNext ( first );
        first.setPrior ( first );
        for ( int i = 1 ; i < num ; i++ ) {
            Node < Integer > temp = new Node <> ();
            temp.setData ( 0 );
            Node < Integer > end = first.getPrior ();
            end.setNext ( temp );
            temp.setPrior ( end );
            temp.setNext ( first );
            first.setPrior ( temp );
        }
    }
}


程序截图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值