java鏈表應(yīng)用--基于鏈表實(shí)現(xiàn)隊(duì)列詳解(尾指針操作)
本文實(shí)例講述了java基于鏈表實(shí)現(xiàn)隊(duì)列。分享給大家供大家參考,具體如下:
在開始棧的實(shí)現(xiàn)之前,我們?cè)賮砜纯搓P(guān)于鏈表的只在頭部進(jìn)行的增加、刪除、查找操作,時(shí)間復(fù)雜度均為O(1)。
一、鏈表改進(jìn)分析
對(duì)于隊(duì)列這種數(shù)據(jù)結(jié)構(gòu),需要在線性結(jié)構(gòu)的一端插入元素,另外一端刪除元素。因此此時(shí)基于鏈表來實(shí)現(xiàn)隊(duì)列,則有一端的時(shí)間復(fù)雜度為O(n)。因此我們不能使用之前已經(jīng)實(shí)現(xiàn)的鏈表結(jié)構(gòu),我們需要改進(jìn)我們的鏈表。思路如下:
1.參考在鏈表頭部刪除、增加元素的時(shí)間復(fù)雜度為O(1)的思路,我們?cè)阪湵淼奈膊吭O(shè)立一個(gè)Node型的變量tail來記錄鏈表的尾部在哪,此時(shí)再head端和tail端添加元素都是及其簡單的,在head端刪除元素也是及其簡單的,但對(duì)于在tail端刪除元素時(shí),是無法在時(shí)間復(fù)雜度為O(1)的情況進(jìn)行的,也就是從tail端刪除元素時(shí)不容易的。
2.只在頭部head刪除元素(隊(duì)首),在尾部tail端添加元素(隊(duì)尾)。
3.由于在基于鏈表實(shí)現(xiàn)隊(duì)列時(shí)不涉及到操作鏈表中間元素,此時(shí)我們改進(jìn)的鏈表中,不在使用虛擬頭節(jié),因此也就可能造成在沒有虛擬頭節(jié)點(diǎn)的情況下,鏈表為空。
二、鏈表改進(jìn)代碼
前言,在寫本小節(jié)之前,我們已經(jīng)實(shí)現(xiàn)了一個(gè)基于靜態(tài)數(shù)組的隊(duì)列,轉(zhuǎn)到查看。此處我們實(shí)現(xiàn)基于鏈表的隊(duì)列。
在實(shí)現(xiàn)基于靜態(tài)數(shù)組的隊(duì)列的時(shí)候,我們已經(jīng)新建了一個(gè)package,此時(shí)我們?cè)谠損ackage下新建一個(gè)LinkedListQueue類,用來實(shí)現(xiàn)Queue接口,目錄結(jié)構(gòu)為:
1.Queue接口代碼
package Queue; public interface Queue<E> { //獲取隊(duì)列中元素個(gè)數(shù) int getSize(); //隊(duì)列中元素是否為空 boolean isEmpty(); //入隊(duì)列 void enqueue(E e); //出隊(duì)列 public E dequeue(); //獲取隊(duì)首元素 public E getFront(); }
2.LinkedListQueue類
package Queue; public class LinkedListQueue<E> implements Queue<E> { //將Node節(jié)點(diǎn)設(shè)計(jì)成私有的類中類 private class Node<E> { public E e; public Node next; //兩個(gè)參數(shù)的構(gòu)造函數(shù) public Node(E e, Node next) { this.e = e; this.next = next; } //一個(gè)參數(shù)的構(gòu)造函數(shù) public Node(E e) { this.e = e; this.next = null; } //無參構(gòu)造函數(shù) public Node() { this(null, null); } @Override public String toString() { return e.toString(); } } private Node<E> head, tail; private int size; //顯示初始化 public LinkedListQueue() { head = null; tail = null; size = 0; } //獲取隊(duì)列中節(jié)點(diǎn)個(gè)數(shù) @Override public int getSize() { return size; } //隊(duì)列中是否為空 @Override public boolean isEmpty() { return size == 0; } //鏈表尾部進(jìn)隊(duì)操作 @Override public void enqueue(E e) { if (tail == null) { tail = new Node(e); head = tail; } else { tail.next = new Node(e); tail = tail.next; } size++; } //鏈表頭部出隊(duì)操作 @Override public E dequeue() { if (isEmpty()) { throw new IllegalArgumentException("鏈表為空"); } Node<E> retNode = head; head = head.next; retNode.next = null; if (head == null) {//當(dāng)鏈表只有一個(gè)元素時(shí) tail = null; } size--; return retNode.e; } //獲取隊(duì)首元素 @Override public E getFront() { if (isEmpty()) { throw new IllegalArgumentException("鏈表為空"); } return head.e; } //為了便于測試,重寫object類toString()方法 @Override public String toString() { StringBuilder res = new StringBuilder(); res.append("Queue: front "); Node<E> cur = head; while (cur != null) { res.append(cur + "->"); cur = cur.next; } res.append("NULL tail"); return res.toString(); } }
3.為了便于測試,在LinkedListQueue類中添加一個(gè)main函數(shù)
//測試用例 public static void main(String[] args) { LinkedListQueue<Integer> queue = new LinkedListQueue<Integer>(); for (int i = 0; i < 10; i++) { queue.enqueue(i); System.out.println(queue); if (i % 3 == 2) {//每添加3個(gè)元素出隊(duì)列一個(gè) queue.dequeue(); System.out.println(queue); } } }
4.結(jié)果為
結(jié)果分析:每進(jìn)隊(duì)3個(gè)元素出隊(duì)列一個(gè)。
關(guān)于本小節(jié),若您覺得還行、還過得去,記得給個(gè)推薦哦~,謝謝??!
本節(jié)源碼 https://github.com/FelixBin/dataStructure/blob/master/src/Queue/LinkedListQueue.java
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- java中用數(shù)組實(shí)現(xiàn)環(huán)形隊(duì)列的示例代碼
- Java 延遲隊(duì)列的常用的實(shí)現(xiàn)方式
- 詳解Java中的延時(shí)隊(duì)列 DelayQueue
- Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列
- Java特性隊(duì)列和棧的堵塞原理解析
- Java實(shí)現(xiàn)自定義阻塞隊(duì)列
- Java優(yōu)先隊(duì)列(PriorityQueue)重寫compare操作
- Java實(shí)現(xiàn)隊(duì)列的三種方法集合
- SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解
- java隊(duì)列之queue用法實(shí)例分析
- JAVA 實(shí)現(xiàn)延遲隊(duì)列的方法
- 詳解java中的阻塞隊(duì)列
- 一口氣說出Java 6種延時(shí)隊(duì)列的實(shí)現(xiàn)方法(面試官也得服)
- Java阻塞隊(duì)列四組API介紹(小結(jié))
- Java中有界隊(duì)列的飽和策略(reject policy)原理解析
- Java消息隊(duì)列JMS實(shí)現(xiàn)原理解析
- Java循環(huán)隊(duì)列原理與用法詳解
- 10分鐘搞定Java并發(fā)隊(duì)列
相關(guān)文章
SpringBoot項(xiàng)目整合jasypt實(shí)現(xiàn)過程詳解
這篇文章主要介紹了SpringBoot項(xiàng)目整合jasypt實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Spring?boot?使用QQ郵箱進(jìn)行一個(gè)驗(yàn)證登入功能
這篇文章主要介紹了Spring?boot?使用QQ郵箱進(jìn)行一個(gè)驗(yàn)證登入,主要包括qq郵箱開啟權(quán)限和創(chuàng)建發(fā)送驗(yàn)證碼的請(qǐng)求Controller,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10一篇文章帶你了解mybatis的動(dòng)態(tài)SQL
這篇文章主要為大家介紹了mybatis的動(dòng)態(tài)SQL?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01SpringBoot快速入門及起步依賴解析(實(shí)例詳解)
SpringBoot?是由?Pivotal?團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化?Spring?應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了SpringBoot快速入門及起步依賴解析,需要的朋友可以參考下2022-10-10深入解析Java的設(shè)計(jì)模式編程中建造者模式的運(yùn)用
這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中建造者模式的運(yùn)用,同時(shí)文中也介紹了建造者模式與工廠模式的區(qū)別,需要的朋友可以參考下2016-02-02使用Java8進(jìn)行分組(多個(gè)字段的組合分組)
本文主要介紹了使用Java8進(jìn)行分組(多個(gè)字段的組合分組),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

Java?導(dǎo)出Excel增加下拉框選項(xiàng)

MAC配置java+jmeter環(huán)境變量過程解析