点击上方蓝色“方志朋”,选择“设为星标”

回复“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实现单链表、栈、队列三种数据结构相关推荐

  1. java 栈_Java实现单链表、栈、队列三种数据结构

    作者:远航 cnblogs.com/yang-guang-zhang/p/13884023.html 一.单链表 1.在我们数据结构中,单链表非常重要.它里面的数据元素是以结点为单位,每个结点是由数据 ...

  2. c语言双链表排序交换节点_图解:单链表翻转的三种方式!

    当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转. 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 nex ...

  3. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  4. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  5. 面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 链表 + 栈 + 队列 部分!

    链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力.链表的操作也离不开指针,指针又很容易导致出错. 综合多方面的原因,链 ...

  6. 【算法数据结构Java实现】Java实现单链表

    1.背景 单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象.需要两个参数定位:一个是index,表示对象的方位.另一个是node的对象. 2.代码 nod ...

  7. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  8. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  9. Java中遍历Set集合的三种方法

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

最新文章

  1. Rsession: R sessions wrapping for Java
  2. HDU-2089-不要62
  3. 自我学习SSM框架集成(二)
  4. Python-Jenkins助力传统发布流程
  5. apache安装时的一些术语
  6. svchost服务(DLL服务)
  7. ResNet最强改进版来了!ResNeSt:Split-Attention Networks
  8. P1459 三值的排序 Sorting a Three-Valued
  9. (Windows7)Visual Studio 2017编译运行出现脚本错误的解决方法
  10. Oracle、SQL Server、MySQL数据类型对比
  11. 古代汉语(王力版)笔记
  12. PyCharm汉化包安装下载及PyCharm无法进行设置问题
  13. echarts r 地图_使用echarts实现省市区地图
  14. 有限元计算计算机配置,有限元分析计算对电脑配置有什么要求
  15. 查找销售模块中装箱单提单主提单当前的编号
  16. php怎么处理背景虚化,图片虚化处理 照片制作成视频|图片背景虚化后制作成视频并添加音乐...
  17. 今天申请了亚马逊新加坡站点
  18. unity地图路径编辑器
  19. wishbone协议(B.3)下载地址
  20. code flattening —— conversion to R1CS——formulation of QAP

热门文章

  1. 2018-3-8(论文--网络评论中的非结构化信息表示与研究)笔记-----基于证据理论的网络评论综合方法
  2. VirtualBox装ghost XP
  3. MySQL图形处理软件Navicat字体配置(乱码解决)
  4. 存储过程处理错误数据
  5. 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
  6. EasyRTMP手机直播推送rtmp流flash无法正常播放问题
  7. 移动端zepot媒体查询media queries
  8. 《代码大全2》读后感czz
  9. [bbk4966]第70集 第8章 -性能维护 01
  10. 【组队学习】【33期】吃瓜教程——西瓜书+南瓜书