数据结构与算法——链表

链表

  • 单链表 Message,MessageQueue
  • 单循环链表
  • 双链表
  • 双向循环链表 LinkedList

优点:插入删除快
缺点:不支持随机访问

##MessageQueue
插入:enqueueMessage(),按照时间顺序插入
删除:next()

整理麻将牌

Mahjong.Class
/**
* @author CSY
* Created by CSY on 2019/1/28.
*/
public class Mahjong {

    public int type;//1筒,2点,3条
    public int rank;//点数1~9

    public Mahjong(int type, int rank) {
        this.type = type;
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "Mahjong{" +
                "type=" + type +
                ", rank=" + rank +
                '}';
    }
}

ExampleUnitTest.class

public class ExampleUnitTest {

    @Test
    public void testMahjong() {
        
        LinkedList<Mahjong> linkedList = new LinkedList<>();
        linkedList.add(new Mahjong(1, 2));
        linkedList.add(new Mahjong(2, 5));
        linkedList.add(new Mahjong(3, 3));
        linkedList.add(new Mahjong(3, 4));
        linkedList.add(new Mahjong(2, 5));
        linkedList.add(new Mahjong(2, 6));
        linkedList.add(new Mahjong(3, 7));
        linkedList.add(new Mahjong(1, 2));
        linkedList.add(new Mahjong(1, 3));
        linkedList.add(new Mahjong(2, 9));
        linkedList.add(new Mahjong(1, 3));
        linkedList.add(new Mahjong(3, 2));
        linkedList.add(new Mahjong(1, 1));

        sortMahjong(linkedList);

        //输出linkedlist
        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println(linkedList.get(i).toString());
        }
    }

    public void sortMahjong(LinkedList<Mahjong> linkedList) {
        //先对点数分组,9种点数
        LinkedList[] linkedLists = new LinkedList[9];
        //初始化数组
        for (int i = 0; i < linkedLists.length; i++) {
            linkedLists[i] = new LinkedList();
        }
        while (linkedList.size() > 0) {
            Mahjong m = linkedList.remove();
            linkedLists[m.rank - 1].add(m);
        }

        for (int i = 0; i < linkedLists.length; i++) {
            linkedList.addAll(linkedLists[i]);
        }

        //得到了九个linkedlist,再对花色分类
        LinkedList[] typeLists = new LinkedList[3];
        //初始化数组
        for (int i = 0; i < typeLists.length; i++) {
            typeLists[i] = new LinkedList();
        }
        while (linkedList.size() > 0) {
            Mahjong m = linkedList.remove();
            typeLists[m.type - 1].add(m);
        }

        for (int i = 0; i < typeLists.length; i++) {
            linkedList.addAll(typeLists[i]);
        }
    }
}

运行testMahjong()方法得到

Mahjong{type=1, rank=1}
Mahjong{type=1, rank=2}
Mahjong{type=1, rank=2}
Mahjong{type=1, rank=3}
Mahjong{type=1, rank=3}
Mahjong{type=2, rank=5}
Mahjong{type=2, rank=5}
Mahjong{type=2, rank=6}
Mahjong{type=2, rank=9}
Mahjong{type=3, rank=2}
Mahjong{type=3, rank=3}
Mahjong{type=3, rank=4}
Mahjong{type=3, rank=7}

牌有序了。

同理,也可以先排花色,再排点数

整理牌的方法是空间换时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值