java基于有序链表的优先级队列实现

来源:互联网 发布:mac充电黄灯一直亮 编辑:程序博客网 时间:2024/05/02 05:46

1.准备

Link.class类中包含数据项(为了简单,这里的数据项就为int值)和下一个Link节点的引用

/**链表中的节点类,保存数据和节点信息*/public class Link{    int priority;//优先级值    Link next;}

2.实现有序链表

OrderLinkList.class类用来处理节点之间的关系

public class OrderLinkList{    private Link first;//新的头节点    private Link current;//保存中间节点信息,保证节点在移动过程中不丢失上一个节点信息    private Link previous;//旧的头节点    private boolean flag = false;    private int size = 0;//链表的长度    /*数据插入方法*/    public void insert(Object data)    {        /*把数据插入到链表的第一个节点*/        Link link = new Link();        link.priority = (Integer) data;        link.next = first;        first = link;        current = first;        previous = first.next;        /*得到数据插入的位置,flag用来控制是否要对节点移动*/        while (current.next != null && link.priority >= current.next.priority)        {            flag = true;            if(current.next == null){break;}            current = current.next;        }        /*移动节点到目标位置*/        if(flag)        {            link.next = current.next;            current.next = link;            first = previous;            flag  = false;        }        size++;    }    public int get(int index)    {        /*没有对index进行检查,有可能发生空指针错误*/        current = first;        for (int i = 0; i < index; i++) {            current= current.next;        }        return current.priority;    }}

这里写图片描述

图片画得有点丑,将就着看


3.有序链表测试

public class LinkMain {    public static void main(String[] args) {        OrderLinkList list = new OrderLinkList();        list.insert(19000);        list.insert(8);        list.insert(800);        list.insert(25);        list.insert(800);        list.insert(3);        list.insert(820);        list.insert(6);        for (int i = 0; i < 8; i++)        {            System.out.print(list.get(i)+" ");        }    }}

运行结果:
3 6 8 25 800 800 820 19000
Process finished with exit code 0


3.优先级队列实现

PriorityQueue.class基于OrderLinkList.class实现

public class PriorityQueue {    private int size = 0;//队列当前长度    private int length = 5;//指定队列的长度    private OrderLinkList list = new OrderLinkList();    public boolean add(int data) {        if (size <= length) {            list.insert(data);            size++;            return true;        } else return false;    }    //移除队头数据    public Integer remove() {        if (size > 0) {            Integer result = new Integer(list.get(0));            list.removeFirst();            size--;            return result;        } else return null;    }}

4.优先级队列测试

public class LinkMain {    public static void main(String[] args) {        //优先级队列的长度为5        PriorityQueue list = new PriorityQueue(5);        //数据add()测试        System.out.println(list.add(19000));        list.add(8);        list.add(800);        list.add(25);        list.add(800);        list.add(820);        System.out.println(list.add(33));        //数据remove()测试        for (int i = 0; i < 8; i++)        {            System.out.print(list.remove()+" ");        }    }}

运行结果:
true
false
8 25 800 800 820 19000 null null
Process finished with exit code 0

以上就是java简单实现基于有序链表的优先级队列,才开始学习这方面的知识,才识浅薄,写的代码也不规范,望各位指正!

0 0