作者:远航

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 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          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          mid=mid.next;          j++;      }      return mid;  }  public static void main(String[] args) {      TLinkedList linkedList = new TLinkedList<>();      linkedList.addFirst("hello1");      linkedList.addFirst("hello2");      linkedList.addFirst("hello3");for (int i = 0; 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           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 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 tQueue = new TQueue<>();        tQueue.put("Hello1");        tQueue.put("Hello2");        tQueue.put("Hello3");for (int i = 0; i 3; i++) {            System.out.println(tQueue.pop());        }    }}

结果:

文章有不足之处,欢迎大家留言指正,谢谢大家啦!

END

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

为什么MySQL不推荐使用uuid或者雪花id作为主键?

为什么建议大家使用 Linux 开发?爽(外加七个感叹号)

IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)

记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

十分钟学会使用 Elasticsearch 优雅搭建自己的搜索系统(附源码)

java 栈_Java实现单链表、栈、队列三种数据结构相关推荐

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

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:远航 cnblogs.com/yang-guang- ...

  2. Java转置_Java实现单链表的逆转置

    单链表逆转置的递归与非递归方式 package link.reverse; // 定义一个单链表 class Node { //变量 private int record; //指向下一个对象 pri ...

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

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

  4. 静态资源java 配置文件_java web 静态资源访问配置三种方式

    方案一:Tomcat的defaultServlet来处理静态文件 要放在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了 方案二 ...

  5. 借助于栈结构将一个单链表逆置

    借助于栈结构将一个单链表逆置. 输入输出样例:1组 #1 样例输入: 5 //链表中有几个元素 1 2 3 4 5 //链表中的元素分别是什么 样例输出: 5 4 3 2 1 //逆置后输出,利用栈结 ...

  6. java带头结点空单链表_Java版带头结点单链表的实现

    Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...

  7. java 反转jia链表_Java实现单链表反转

    本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(S ...

  8. 第7周项目实践2.1 用只有尾节点指针rear的循环单链表实现队列算法库

    //用只有尾节点指针rear的循环单链表作为队列存储结构,其中每个节点的类型为LinkNode,rear指针用于唯一标识链队 typedef struct LinkNode {int date;Lin ...

  9. 单链表实现队列的基本操作(入队,出队)

    单链表实现队列的基本操作(包括初始化队列,入队,出队) 构造队列结构体 struct node {int data;node *next; };struct queue {node *head, *t ...

最新文章

  1. python 字符串输入时间_Python input()函数:获取用户输入的字符串
  2. 微软官方再次上线了Python教程,这次比较高级
  3. Hadoop 之父趣事:用儿子的大象玩偶为大数据项目命名
  4. vb.net与c#相互转换工具
  5. android:windowSoftInputMode属性
  6. Excel导入sqlserver
  7. 大学计算机基础实验指导试题,(大学计算机基础实验指导)模拟试题(二)参考答案...
  8. 如何使用验证控件对DropDownList进行验证
  9. 旧调重弹-SetUnhandledExceptionFilter的使用问题
  10. Jsoup解析html某片段的问题
  11. MyEclipse代码提示快捷键和常用设置
  12. vue中使用axios发送请求(二)
  13. Data crossstore between Mongo and JPA
  14. 全局变量在多个进程中不共享
  15. TCP,IP,UDP等各种报文格式
  16. asp 服务器文件重命名,aspupload文件重命名及上传进度条的解决方法附代码
  17. FIR 线性相位系统 最小相位系统 滤波器延迟
  18. MyBatis主键回填
  19. python第一周习题
  20. python和stata怎么结合_双剑合璧之Stata与Python:初识IPyStata

热门文章

  1. Leetcode 690
  2. cocos creator基础-(三十一)超大数值计算
  3. python的list()列表数据类型的方法详解
  4. Linux内核分析:recv、recvfrom、recvmsg函数实现
  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
  6. 前年的斐波那契蹲在地上看着你,笑而不语
  7. hibernate配置文件hibernate.cfg.xml的详细解释
  8. zoj1134 Strategic Game(DP/图论)
  9. 构建插件式的应用程序框架(四)----服务容器
  10. [WCF]相关资料整理