Java实现单链表、栈、队列三种数据结构
点击上方蓝色“方志朋”,选择“设为星标”
回复“666”获取独家整理的学习资料!
作者:远航
cnblogs.com/yang-guang-zhang/p/13884023.html
一、单链表
1、在我们数据结构中,单链表非常重要。它里面的数据元素是以结点为单位,每个结点是由数据元素的数据和下一个结点的地址组成,在java集合框架里面 LinkedList、HashMap(数组加链表)等等的底层都是用链表实现的。
2、下面是单链表的几个特点:
数据元素在内存中存放的地址是不连续的:单链表的结点里面还定义一个结点,它里面保存着下一个结点的内存地址,在实例化对象的时候,jvm会开辟不同内存空间,并且是不连续的。
添加效率高:添加一个元素时,先找到插入位置的前一个,只需要将1,2个元素的连接断开,将插入结点的next指向第一个元素的next
(1),然后将第一个元素的next指向插入结点(2),
不用在挪动后面元素。
删除效率高:删除一个元素时,先找到删除位置,将前一个的next指向删除位置的next,不用在挪动后面元素。
查询效率低:查询的时候必须从头开始,依次遍历,而数组因为它的内存是连续的,可以直接通过索引查找。
3、下面通过代码来实现单链表结构:
package com.tlinkedList;/**
* User:zhang
* Date:2020/10/26
**/
public class TLinkedList<T> {private Node head;//链表头部private int size;//链表元素的个数public TLinkedList(){head=null;size=0;}
// 将结点作为内部类。也可以新建一个Node类,作为结点class Node{private Node next;//下一个结点private T t;//结点的数据public Node(T t){this.t=t;}public T getT() {return t;}public void setT(T t) {this.t = t;}}
// 在链表头部添加一个结点public void addFirst(T t){Node node = new Node(t);node.next=head;head=node;size++;}
// 在链表中间添加一个结点public void addMid(T t,int index){Node node = new Node(t);Node mid=head;for (int i = 0; i < index - 1; i++) {mid=mid.next;}node.next=mid.next;mid.next=node;size++;}
// 在链表尾部添加一个结点public void addLast(T t){Node node = new Node(t);Node last=head;while (last.next!=null){last=last.next;}last.next=node;node.next=null;size++;}
// 删除链表的头结点public void removeFirst(){head=head.next;size--;}
// 删除链表的中间元素public void removeMid(int index){Node mid=head;if (index==0){removeFirst();return;}int j=0;Node qMid=head;while (j<index){qMid=mid;mid=mid.next;j++;}qMid.next=mid.next;size--;}
// 删除链表的尾结点public void removeLast(){Node mid=head;Node qMid=head;while (mid.next!=null){qMid=mid;mid=mid.next;}qMid.next= null;size--;}
// 获取链表指定下标的结点public Node get(int index){Node mid=head;if (index==0){return head;}int j=0;while (j<index){mid=mid.next;j++;}return mid;}public static void main(String[] args) {TLinkedList<String> linkedList = new TLinkedList<>();linkedList.addFirst("hello1");linkedList.addFirst("hello2");linkedList.addFirst("hello3");for (int i = 0; i < linkedList.size; i++) {System.out.println(linkedList.get(i).getT());}
// linkedList.removeLast();
// linkedList.removeFirst();
// linkedList.addLast("hello4");linkedList.addMid("hello",2);System.out.println("--------------");for (int i = 0; i < linkedList.size; i++) {System.out.println(linkedList.get(i).getT());}}
}
结果如下:
二、栈(Stack)
1、一提到栈我们脑海就会浮现四个字“先进后出”,没错,它就是栈的最大特点。
2、栈的应用场景也非常多,比如将字符串反转、jvm里面的栈区等等。
3、栈里面的主要操作有:
push(入栈):将一个数据元素从尾部插入
pop(出栈):将一个数据元素从尾部删除
peek(返回栈顶元素):将栈顶元素的数据返回
相当于只有一个开口就是尾部,只能从尾进,从尾出。
4、下面通过链表结构实现栈结构:
package com.tStack;/**
* User:zhang
* Date:2020/10/26
**/
public class Test_Stack<T> {private Node head;//栈的头结点private int size;//栈的元素个数class Node{private Node next;//下一个结点private T t;//结点的数据public Node(T t){this.t=t;}public T getT() {return t;}public void setT(T t) {this.t = t;}}public Test_Stack() {head=null;size=0;}public static void main(String[] args) {Test_Stack<String> TStack = new Test_Stack<>();TStack.push("hello1");TStack.push("hello2");TStack.push("hello3");for (int i = 0; i < 3; i++) {System.out.println(TStack.pop());}}
// 入栈public void push(T t){Node node = new Node(t);if (size==0){node.next=head;head=node;size++;return;}if (size==1){head.next=node;node.next=null;size++;return;}Node lastNode=head;while (lastNode.next!=null){lastNode=lastNode.next;}lastNode.next=node;node.next=null;size++;}
// 出栈public T pop(){if (size==0){System.out.println("栈内无值");return null;}if (size==1){T t = head.getT();head=null;size--;return t;}Node lastNode=head;Node qNode=head;while (lastNode.next!=null){qNode=lastNode;lastNode=lastNode.next;}T t = lastNode.getT();qNode.next=null;size--;return t;}
// 获取栈里面元素的个数public int getSize(){return size;}
// 返回栈顶元素public T peek(){if (size==0){System.out.println("栈内无值");return null;}if (size==1){return head.getT();}Node lastNode=head;while (lastNode.next!=null){lastNode=lastNode.next;}return lastNode.getT();}
}
结果:
三、队列(Queue)
1、队列的特点也用“先进先出”四个字来概括。就是先进去的元素先输出出来。
2、我们常见的消息队列就是队列结构实现的。
3、队列的常见操作如下:
put(入队):将一个结点插入到尾部。
pop(出队):将头结点的下一个结点作为头,然后将原来的头结点删除。
4、通过链表结构实现队列:
package com.tQueue;/*** User:zhang* Date:2020/10/26**/
public class TQueue<T> {private Node front;//头结点private Node tail;//尾结点private int size;//队列中元素的个数class Node {private Node next;//下一个结点private T t;//结点的数据public Node(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}}public int getSize() {return size;}public void setSize(int size) {this.size = size;}public TQueue() {front = tail = null;}// 入队public void put(T t) {Node node = new Node(t);if (size == 0) {front = tail = node;size++;return;}Node lastNode = front;while (lastNode.next != null) {lastNode = lastNode.next;}lastNode.next = node;tail = node;size++;}// 出队public T pop() {if (size == 0) {System.out.println("队列中无值");return null;}T t = front.getT();front=front.next;size--;return t;}public static void main(String[] args) {TQueue<String> tQueue = new TQueue<>();tQueue.put("Hello1");tQueue.put("Hello2");tQueue.put("Hello3");for (int i = 0; i < 3; i++) {System.out.println(tQueue.pop());}}
}
结果:
文章有不足之处,欢迎大家留言指正,谢谢大家啦!
热门内容:
第 3 次读 Effective Java,这 58 个技巧最值!
10大黑客专用的 Linux 操作系统,每个都很酷!
Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!
Java生鲜电商平台-监控模块的设计与架构
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
Java实现单链表、栈、队列三种数据结构相关推荐
- java 栈_Java实现单链表、栈、队列三种数据结构
作者:远航 cnblogs.com/yang-guang-zhang/p/13884023.html 一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据 ...
- c语言双链表排序交换节点_图解:单链表翻转的三种方式!
当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转. 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 nex ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- java实现单链表常见操作,java面试题,java初级笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...
- 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!
链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...
- 【算法数据结构Java实现】Java实现单链表
1.背景 单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象.需要两个参数定位:一个是index,表示对象的方位.另一个是node的对象. 2.代码 nod ...
- 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)
C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- Java中遍历Set集合的三种方法
Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...
最新文章
- Rsession: R sessions wrapping for Java
- HDU-2089-不要62
- 自我学习SSM框架集成(二)
- Python-Jenkins助力传统发布流程
- apache安装时的一些术语
- svchost服务(DLL服务)
- ResNet最强改进版来了!ResNeSt:Split-Attention Networks
- P1459 三值的排序 Sorting a Three-Valued
- (Windows7)Visual Studio 2017编译运行出现脚本错误的解决方法
- Oracle、SQL Server、MySQL数据类型对比
- 古代汉语(王力版)笔记
- PyCharm汉化包安装下载及PyCharm无法进行设置问题
- echarts r 地图_使用echarts实现省市区地图
- 有限元计算计算机配置,有限元分析计算对电脑配置有什么要求
- 查找销售模块中装箱单提单主提单当前的编号
- php怎么处理背景虚化,图片虚化处理 照片制作成视频|图片背景虚化后制作成视频并添加音乐...
- 今天申请了亚马逊新加坡站点
- unity地图路径编辑器
- wishbone协议(B.3)下载地址
- code flattening —— conversion to R1CS——formulation of QAP
热门文章
- 2018-3-8(论文--网络评论中的非结构化信息表示与研究)笔记-----基于证据理论的网络评论综合方法
- VirtualBox装ghost XP
- MySQL图形处理软件Navicat字体配置(乱码解决)
- 存储过程处理错误数据
- 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
- EasyRTMP手机直播推送rtmp流flash无法正常播放问题
- 移动端zepot媒体查询media queries
- 《代码大全2》读后感czz
- [bbk4966]第70集 第8章 -性能维护 01
- 【组队学习】【33期】吃瓜教程——西瓜书+南瓜书