1、单链表和数组的区别

数组:数组的存储空间是连续的,需要事先申请空间确定大小,通过下标查找数据,所以查找速度快,但是增加和删除速度慢
链表:离散存储,不需要事先确定大小,通过头指针加遍历查找数据,查找数据慢,但是增加和删除速度快

【举例】

把内存空间看成一个教室,同学代表数据

【数组】

  • 申请空间

int[] seat = new int[5]表示我从教室(内存空间)申请第一排座位(数组),座位按1,2,3.....的顺序标记,seat[1]表示坐在第一个位置的同学(数据),同学只能坐第一排。

  • 存储数据

    • 来了第一个同学(1)他坐在了第1个位置(int[0] = 1),

    • 来了第二个同学(4) 他屁事多,他要做第6个位置(int[5] = 4),此时老师骂人了,那里不让做(数组越界异常),无奈,第二个同学选择了第4个位置(int[3] = 4)

    • 接下来五个同学都坐满了

  • 查找

查找数据就不用说了吧,对号入座,老师很快就可以按座位号(下标)叫第几个同学回答问题

  • 删除

这个就有点麻烦了,第二个同学不认真,老师叫他滚出去,这时候座位号应该减少一个,那么第三个同学就要往左移一格(int[1] = int[2]),后面依次往左移一格,最后int[4]空出来了,所以应该把最后一个座位还给教室(归还给内存),所以说这个还是比较麻烦的(ps:我是按照c语言思想讲这里的,只学过Java的同学可能难以接受)需要移动座位,很麻烦

【链表】

  • 申请空间

    链表不需要事先申请空间

  • 添加数据(这里讲的是有头节点的链表,方便写代码)

    • 老师先让班长(头节点)找好位置(可用内存),老师只知道班长的座位号(地址),这时候班长找好了位置,告诉了老师,老师对班长说:吩咐下去,叫每一个同学记好在他们后一个进教室的同学的座位(地址)

    • 第一个同学M进来,按照自己的心情找了个空座位(可用内存),班长(头节点)记录了他的座位

    • 第二同学N进来,也按照自己的心情找了个空座位(可用内存),第一个同学记录了第二个同学的座位

      ......以此类推

  • 查找数据(每个同学只知道他们下一个进来的同学)

    • 老师对班长(头节点)说:点名,第3个进来的同学回答问题

    • 班长说:我后面进来的是同学M,找到了M

    • M说:我后面进来的是同学N,找到了N

    • N说:我后面进来的同学是X,找到了第三个进来的同学X

    • 老师说:就是你了,同学X回答问题

  • 删除数据

    • 第2个进教室的同学调皮捣蛋,老师让他滚出去
    • 重复查找数据步骤,班长——>M——>N(找到第二进来的同学)
    • 让N滚动,此时,在M后进入的同学就是X了,只要记住座位号就可以了
    • 不要移动座位,很方便

  • 插入数据

    • 同学N改过自新了,重新申请做在第二个位置
    • 重复查找步骤,班长——>M(找到第一个进来的同学)
    • M记住他的下一个同学是N
    • N记住他的下一个同学是X
    • 不要移动座位,很方便

2、代码实现

数据结构这种东西,太玄学了,我当初学的c语言版本,学了好久就是不明白,突然有一天就脑袋就开窍了,估计是菩萨保佑

现在来用java代码实现

1、定义链表

public class SingleLinkedList<T>{
//记录链表长度
private int size;
//头节点,不存数据,方便实现增删代码的
private Node head;
/**
* 成员内部类,节点类,相当于例子中的同学和座位号的集合题
* 我觉得这个类不应该暴露给外部
*/
private class Node{
private Node next;
private T t;
Node(Node next,T t){
this.next = next;
this.t = t;
}
Node(T t){
this(null,t);
}
Node(){
Node next = null;
t = null;
}
}
//链表构造方法
public SingleLinkedList(){
//初始化头节点,不存数据,方便实现增删代码的
this.head = new Node();
this.size = 0;
} /**
* 此处省略了方法,单独拿出来给大家讲解
* .........
*/
}

2、获取长度

//获取长度
public int getSize(){
return size;
}

3、添加节点

 //添加节点
public void add(T t){
Node newNode = new Node(t);
Node temp = this.head;
while(temp.next != null){
temp = temp.next;
}
temp.next = newNode;
size++;
}

4、插入节点

//插入节点,先判断节点是否合法
public void insert(T t,int index){
if(index <= 0 || index > this.size){
throw new RuntimeException("index参数不合法");
}
Node newNode = new Node(t);
Node temp = this.head;
//要明白到底循环几次
for (int i = 1; i < index; i++) {
temp = temp.next;
}
//注意顺序
newNode.next = temp.next;
temp.next = newNode;
size++;
}

5、取节点数据

//取节点数据
public T getValue(int index){
if(index <= 0 || index > this.size){
throw new RuntimeException("index参数不合法");
}
Node temp = this.head;
//要明白到底循环几次
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp.t;
}

6、删除节点

//删除节点
public void delete(int index){
if(index <= 0 || index > this.size){
throw new RuntimeException("index参数不合法");
}
Node temp = this.head;
//要明白到底循环几次
for (int i = 1; i < index; i++) {
temp = temp.next;
}
temp.next = temp.next.next;
//java垃圾回收机制gc自动回收内存
size--;
}

7、遍历

//遍历
public void showData(){
Node temp = this.head;
//要明白到底循环几次
for (int i = 0; i < this.size; i++) {
temp = temp.next;
System.out.print("["+temp.t+"]-->");
}
}

【总结】

个人代码水平有限,仅作参考

Java实现链表(个人理解链表的小例子)的更多相关文章

  1. Java线程池ExecutorService和CountDownLatch的小例子

    import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java ...

  2. JAVA 循环在一个数字前面填充0.小例子

    输入结果 00000000000567 String bala="567"; 固定长度是14位,怎么循环在bala前面填充00000000000 System.out.printl ...

  3. jetty 介绍以及小例子

    Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布.开发人员可以将 ...

  4. 数据结构——基于java的链表实现(真正理解链表这种数据结构)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10759599.html,否则将追究法律责任!!! 一.链表介绍 1.什么是链表? 链表是一 ...

  5. Java数据结构和算法之链表

    三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...

  6. 自己动手实现java数据结构(二) 链表

    1.链表介绍 前面我们已经介绍了向量,向量是基于数组进行数据存储的线性表.今天,要介绍的是线性表的另一种实现方式---链表. 链表和向量都是线性表,从使用者的角度上依然被视为一个线性的列表结构.但是, ...

  7. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  8. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  9. java基础之自定义单链表练习

    一.单链表 1.单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置), ...

  10. 约瑟夫斯问题-java版数组解法和链表解法

    10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号? 数组解法: 数组存放数组:a[10]存在1到10编号人 数组遍历到尾部又从头遍历:遍历数组 ...

随机推荐

  1. MySQL datetime类型详解

    研发反馈问题,数据库中datetime数据类型存储的值末尾会因四舍五入出现不一致数据,影响查询结果,比如:程序中自动获取带毫秒精度的日期'2019-03-05 01:53:55.63',存入数据库后变 ...

  2. Mysql性能优化:为什么你的count(*)这么慢?

    导读 在开发中一定会用到统计一张表的行数,比如一个交易系统,老板会让你每天生成一个报表,这些统计信息少不了 sql 中的count函数. 但是随着记录越来越多,查询的速度会越来越慢,为什么会这样呢?M ...

  3. python中面向对象&装饰器

    类的定义 基本形式: class ClassName(object): Statement 1.class定义类的关键字 2.ClassName类名,类名的每个单词的首字母大写. 3.object是父 ...

  4. 二、sudo su root 和sudo su -的区别

    1.使用sudo su root可以快速切换为root用户,输入密码后输pwd可以看到它还是在主目录下即/home/sdbi 显示为:用户名@主机名:/home/sdbi#即root@linux:/h ...

  5. mybatis 源码赏析(一)sql解析篇

    本系列主要分为三部分,前两部分主要分析mybatis的实现原理,最后一部分结合spring,来看看mybtais是如何与spring结合的就是就是mybatis-spring的源码. 相较于sprin ...

  6. WiX 简介

    最近研究了一下WIX打包,简单总结一下,方便自己以后查阅,也希望能给需要的人一些提示和帮助. WiX 简介 Windows Installer XML (WiX ) 平台是一组工具与规范,使您能够创建 ...

  7. js定时器及定时器叠加问题

    回武汉隔离的第二天打卡,武汉加油,逆战必胜!今天想和大家简单聊一下js定时器的问题. 1.setTimeout 延时器 在指定时间后执行一次,注意只会执行一次 当然有的时候我们想用延时器做出定时器的效 ...

  8. memcached-tool 工具

    perl memcached-tool server_ip:port stats 输出说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的uni ...

  9. HDU-5963 朋友 思维

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5963 吐槽 这道题我第一眼看,嗯??博弈论?还是树上的?我好像不会啊...但是一想某人的话,感觉这个应该 ...

  10. 个人博客如何申请ICP备案

    目录 前言 一定要备案吗? 备案前的准备 域名 备案资料 备案服务号 如何申请ICP备案 备案成功之后 总结 关于博客的搭建 参考资料 推荐阅读 前言 前一段时间,博客域名在申请ICP备案,暂时不能访 ...