用链表实现队列/栈

简介: 本文介绍如何用链表实现栈和队列,利用双链表头尾操作均为O(1)的特性,通过调用LinkedList API高效实现。栈可选头部或尾部作栈顶,队列同理,只需调整增删位置。文末引出数组实现队列的性能问题,启发优化思考。

用链表实现栈
一些读者应该已经知道该怎么用链表作为底层数据结构实现队列和栈了。因为实在是太简单了,直接调用双链表的 API 就可以了。
注意我这里是直接用的 Java 标准库的 LinkedList,如果你用之前我们实现的 MyLinkedList,也是一样的。
提示
上面这段代码相当于是把双链表的尾部作为栈顶,在双链表尾部增删元素的时间复杂度都是 O(1),符合要求。
当然,你也可以把双链表的头部作为栈顶,因为双链表头部增删元素的时间复杂度也是 O(1),所以这样实现也是一样的。只要做几个修改 addLast -> addFirst,removeLast -> removeFirst,getLast -> getFirst 就行了。
用链表实现队列
同理,用链表实现队列也是一样的,也直接调用双链表的 API 就可以了:
Java
运行代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.LinkedList;

// 用链表作为底层数据结构实现队列
public class MyLinkedQueue {
private final LinkedList list = new LinkedList<>();

// 向队尾插入元素,时间复杂度 O(1)
public void push(E e) {
    list.addLast(e);
}

// 从队头删除元素,时间复杂度 O(1)
public E pop() {
    return list.removeFirst();
}

// 查看队头元素,时间复杂度 O(1)
public E peek() {
    return list.getFirst();
}

// 返回队列中的元素个数,时间复杂度 O(1)
public int size() {
    return list.size();
}

public static void main(String[] args) {
    MyLinkedQueue<Integer> queue = new MyLinkedQueue<>();
    queue.push(1);
    queue.push(2);
    queue.push(3);

    System.out.println(queue.peek()); // 1
    System.out.println(queue.pop()); // 1
    System.out.println(queue.pop()); // 2
    System.out.println(queue.peek()); // 3
}

}
提示
上面这段代码相当于是把双链表的尾部作为队尾,把双链表的头部作为队头,在双链表的头尾增删元素的复杂度都是 O(1),符合队列 API 的要求。
当然,你也可以反过来,把双链表的头部作为队尾,双链表的尾部作为队头。类似栈的实现,只要改一改 list 的调用方法就行了。
文末思考
双链表他比较牛,队列和栈的 API 考不倒它。但是你想一下,数组实现队列的时候,会不会有问题?
队列 API 要求一端增加元素,一端删除元素,而数组的头部无论是增加还是删除元素,时间复杂度都是 O(n)。这种情况下,有没有办法优化呢?
你可以思考一下,下一章我会告诉你答案。

相关文章
|
编译器 C++ Windows
win10 环境下配置 openGL的freeglut、glew等库,使用openGL
win10 环境下配置 openGL的freeglut、glew等库,使用openGL
8052 0
|
3月前
|
传感器 人工智能 边缘计算
宠物识别算法在智能猫窝上的应用:区域预警、Vlog生成与睡眠监测一体化方案
基于边缘计算与多传感器融合,智能猫窝集成宠物识别算法,实现区域预警、Vlog自动生成与睡眠监测一体化。通过AI视觉、毫米波雷达等技术,精准识别宠物行为,助力远程看护与健康管理,提升人宠情感连接,打造智慧养宠新体验。
389 1
|
3月前
|
人工智能 自然语言处理 小程序
2025 电商智能客服系统推荐:高转化、低成本的客服解决方案
电商智能客服已成营收助力,2025年渗透率超72%。专业系统可提升转化率18%、降本35%。本文基于最新数据,解析阿里云、Zendesk、华为云、科大讯飞四大主流系统在大模型应用、全渠道整合、高并发承载等核心能力,结合企业场景提供选型指南,助力电商高效决策。
2025 电商智能客服系统推荐:高转化、低成本的客服解决方案
|
3月前
|
缓存 安全
String,StringBuilder 和 StringBuffer 的区别
String不可变,StringBuilder与StringBuffer可变;后者线程不安全,StringBuffer线程安全。大量拼接时优先选用后两者,多线程用StringBuffer,单线程用StringBuilder。String因final设计保证不可变,利于安全与缓存。
|
3月前
|
机器学习/深度学习 人工智能 监控
云原生AI应用开发
本指南系统阐述云原生AI应用开发实践路径,涵盖MLOps体系构建、PAI-DSW开发平台、特征工程管理、AutoML模型训练、A/B测试部署、全链路监控及AI-CICD流水线,结合阿里云PAI工具链与行业案例,助力企业实现高效、稳定、可迭代的AI应用落地。(238字)
229 0
|
8月前
|
弹性计算 运维 Linux
3分钟幻兽帕鲁游戏链接服务器一键部署教程,基于阿里云服务器
本教程介绍如何使用阿里云服务器快速部署《幻兽帕鲁》联机服务,支持与好友联机游戏。内容包括服务器配置、计费说明、服务创建及登录游戏步骤,同时提供存档管理与配置修改方法,助您轻松搭建专属游戏服务器。
|
7月前
|
域名解析 运维 监控
阿里云轻量服务器的系统镜像和应用镜像的区别
轻量应用服务器是阿里云推出的易用型云服务器,支持一键部署、域名解析、安全管理和运维监控。本文介绍其系统镜像与应用镜像的区别及选择建议,助您根据业务需求和技术能力快速决策,实现高效部署。
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
关系型数据库 数据库 数据管理
DTS的应用
【6月更文挑战第3天】DTS的应用
2165 3
|
数据可视化 数据挖掘
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码1
R语言广义线性混合模型GLMMs在生态学中应用可视化2实例合集|附数据代码