1. 程式人生 > >java基於有序連結串列的優先順序佇列實現

java基於有序連結串列的優先順序佇列實現

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簡單實現基於有序連結串列的優先順序佇列,才開始學習這方面的知識,才識淺薄,寫的程式碼也不規範,望各位指正!

相關推薦

java基於有序連結串列優先順序佇列實現

1.準備 Link.class類中包含資料項(為了簡單,這裡的資料項就為int值)和下一個Link節點的引用 /**連結串列中的節點類,儲存資料和節點資訊*/ public class

基於有序連結串列實現的優先佇列

博主最近在苦讀演算法第四版,在第二章第四節的優先佇列的實現中,作者提到了可以用有序或無序連結串列實現優先佇列,博主在網上大致查閱了一下,好像沒有現成的java程式碼(泛型的),於是自己根據找到的程式碼簡單修改並實現了一下,特此記錄一下。 /*定義結點的抽象資料型別*/

基於連結串列佇列實現

1.建立鏈節點類link 只有一種資料int型別,和對下一個鏈節點的引用next public class Link { public int a; public Link next; public Link(int m){ a=m; }

LeetCode題目--合併兩個有序連結串列(python實現

題目 將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。  示例: 輸入:1->2->4, 1->3->4 輸出:1->1->2->3->4->4

LeetCode 21.合併兩個有序連結串列 C++程式碼實現

題目描述: 將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。  示例: 輸入:1->2->4, 1->3->4 輸出:1->1->2->3->4->4

基於java自帶連結串列結構實現迴圈連結串列

背景 有些場景下,需要迴圈連結串列,如某些狀態是從一個到下一個,最後再回到開始。此種情況下,可以採用迴圈連結串列來實現。 程式碼 package com.cxyzy.tencentfacerec; import java.util.Iterator; import java.u

java實現將兩個有序連結串列合成一個新的有序連結串列

連結串列節點結構及方法: public class Node { private Node next; private Integer number; Node(){} Node(Integer number) { this.number=number; next=n

教你如何使用Java手寫一個基於連結串列佇列

  在上一篇部落格【教你如何使用Java手寫一個基於陣列的佇列】中已經介紹了佇列,以及Java語言中對佇列的實現,對佇列不是很瞭解的可以我上一篇文章。那麼,現在就直接進入主題吧。   這篇部落格主要講解的是如何使用單鏈表實現一個簡單版的佇列。單向連結串列佇列是屬於非迴圈佇列,同時佇列的長度是不受限制的,也就

java實現兩個有序連結串列合併為一個有序連結串列

節點類 public class Node { private Node next; private Integer number; Node(Integer number) { this.number=number; next=null; } Node() {

LeetCode第23題:合併K個有序連結串列JAVA實現

題目: 我的解答: 思路很簡單,把所有的資料先讀到ArrayList中然後轉到陣列中,然後排序,然後構建新連結串列 程式碼: /** * Definition for singly-linked list. * public class ListNode {

兩個有序連結串列序列的合併(java實現

02-線性結構1 兩個有序連結串列序列的合併(15 分)本題要求實現一個函式,將兩個連結串列表示的遞增整數序列合併為一個非遞減的整數序列。函式介面定義:List Merge( List L1, List L2 );輸入樣例:3 1 3 5 5 2 4 6 8 10 輸出樣例:

基於連結串列、陣列實現佇列、迴圈佇列

佇列是一種先進先出的資料結構,它和棧的性質正好相反,但是兩者卻經常結合在一起實現一些特殊的操作。 1.佇列的介面 public interface QueueADT { //入隊 public void enqueue(Object element); //出隊 p

Java資料結構之——佇列:通過連結串列和陣列實現

//連結串列實現佇列 class Node<E>{ Node<E> next = null; E data; public Node(E data){ this.data = data; } } public clas

有序連結串列實現優先佇列

/** * 有序連結串列的優先佇列 * */ class Lin { public int data; public Lin next; public Lin(int i) { dat

自己實現Java基於雙向連結串列的LinkedList

以下程式碼完全原創,如有紕漏或不足,請指出,多謝。 用於實現雙向連結串列的節點物件,程式碼如下: package custom.node; public class Node<E> { //節點中的資料 private

java兩個有序連結串列合併

                                       java兩個有序連結串

Leetcode演算法Java全解答--21. 合併兩個有序連結串列

Leetcode演算法Java全解答–21. 合併兩個有序連結串列 文章目錄 Leetcode演算法Java全解答--21. 合併兩個有序連結串列 題目 想法 結果 總結 程式碼 我的答案

資料結構 - 基於連結串列佇列

基於連結串列的佇列   當我們基於連結串列實現佇列時,需要從一端加元素,另一端取出元素,就需要引入一個新的變數tail指向連結串列的尾部,此時,向尾部進行新增操作時間複雜度會變為O(1),然而刪除操作還是需要從head向後遍歷,所以此時選擇連結串列尾為隊尾,連結串列頭為隊首。      基於連結串列的實

java版資料結構與演算法—有序連結串列

package com.zoujc.sortLink; /** * 有序連結串列 */ class Link { public int dData; public Link next; public Link(int dd){ dData = d

Python3 連結串列佇列和棧的實現

# -!- coding: utf-8 -!- # !/usr/bin/env python 3.6.3 # author: Vivian # time: 2018/9/16 # 使用list列表構造棧 class Stack(object): def __init