1.一个最简单的线性表

1.1单链表的特征:

a.链表无法通过索引获取链表元素,只能从头开始一个一个的后继去找。

b.链表无法找到父节点

1.2结构:

1.3 实现

我们来讨论一下它的时间复杂度:

1.3.1 add函数:

这个函数就是直接在end()后面再加一个元素。那么时间复杂度就是o(1),这很容易想到。因为我不需要遍历。

1.3.2 delete函数:

这个函数有点意思,见图1-1,如果我们要删除A3节点,删除方法就是:

那么我们得获取A2节点,怎么获取A2节点呢?链表的本质特征见1.1,我们发现,无法获取索引,只能通过遍历的方式获取这个节点,那么就得耗费一点时间了,这个时间就和你要删除的对象的index有关,所示时间复杂度为o(index)

1.3.3 insert函数:

一个道理,时间复杂度为o(index)

1.3.3 get函数:

根据单链表的特征1.2,我们要获得第i个对象,则只能通过遍历的方式,所有他的时间复杂度还是o(i)。

1.4 和数组比较,它的优劣势?

a.劣势就是无法通过索引去获取元素,毕竟数组获取元素的时间复杂度是o(1),而它是o(index)!

b.优势在于,它的删除,插入元素会很爽。

我们思考一个问题,在数组里面,如果你要插入一个元素,时间复杂度是多少?

import org.junit.jupiter.api.Test;public class ArrayOperation<T> {public T[] insert(T[] tList,int index,T value){T[] tempList = (T[])new Object[tList.length+1];for (int i =0;i<tList.length;i++){if (i<index){tempList[i] = tList[i];}else {tempList[i+1] = tList[i];}}tempList[index ] = value;return tempList;}public static<T> void print(T[] arr){for (int i =0;i<arr.length;i++){System.out.print(arr[i].toString()+" ");}System.out.print("\n");}@Testpublic void t2(){ArrayOperation ao = new ArrayOperation<Integer>();Integer[] v1 = new Integer[10];for (int i =0;i<v1.length;i++){v1[i] = i;}print(v1);Object[] v2 =  ao.insert(v1,5,38);print(v2);}}

输出结果是:

来,分析一下这个函数

咱是不是做了一个遍历?遍历长度是八是n?那答案是?当然是o(n)啦!

那么如果是链表呢?答案则是o(index)

你发现...爽不,删除也一样。

2.单链表的实现

2.1 元素的实现:

public class LineElement {public LineElement(Integer value){setValue(value);}public Integer getValue() {return value;}public void setValue(Integer value) {this.value = value;}public LineElement getNext() {return next;}public void setNext(LineElement next) {this.next = next;}private Integer value;private LineElement next;@Overridepublic String toString() {return value+"";}
}

2.2 表的实现:

import com.sun.org.apache.bcel.internal.generic.RET;
import netscape.security.UserTarget;
import org.junit.jupiter.api.Test;public class LineTable implements ITable<LineElement>{private LineElement headElement;private LineElement endElement;public LineTable(Integer value){headElement = new LineElement(value);}@Overridepublic LineElement head() {return headElement;}@Overridepublic LineElement end() {return endElement;}@Overridepublic int len() {return 0;}@Overridepublic void add(LineElement lineElement) {LineElement selectElement = headElement;while (selectElement.getNext()!= null){selectElement = selectElement.getNext();}selectElement.setNext(lineElement);endElement = lineElement;}@Overridepublic void delete(int index) {LineElement selectElement = getIndexElement(index);selectElement.setNext(selectElement.getNext().getNext());}@Overridepublic void insert(LineElement lineElement,int index) {LineElement selectElement = getIndexElement(index);lineElement.setNext(selectElement.getNext());selectElement.setNext(lineElement);}@Overridepublic LineElement get(int index) {LineElement selectElement = getIndexElement(index);return selectElement;}public LineElement getIndexElement(int index){LineElement selectIndex = headElement;for (int i = 0;i<index;i++){selectIndex = selectIndex.getNext();}return selectIndex;}public static void main(String[] arg){LineTable table = new LineTable(0);for (int i =1;i<10;i++){table.add(new LineElement(i));}System.out.println(table.toString());table.insert(new LineElement(12),5);System.out.println(table.toString());table.delete(7);System.out.println(table.toString());LineElement element = table.get(3);System.out.println(element.toString());}@Overridepublic String toString() {String v ="";LineElement selectElement = headElement;while (selectElement!= null){v+=selectElement.getValue()+" ";selectElement = selectElement.getNext();}return v;}
}

测试结果:

至于其他骚操作嘛...哎,太简单了,随便弄就行。

卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表相关推荐

  1. 卜若的代码笔记-webgl系列-第三章:几何渲染Rendering Geometry

    1 在webgl里面表述几何体最关键的两种数据类型: 顶点和索引(vertices and indices.) 1.1 顶点是什么? 顶点定义了3D对象的角点,每一个顶点由三个元素组成x,y,z. 在 ...

  2. 卜若的代码笔记-数据结构系列-第十二章:栈三.链栈

    1.太简单了,不介绍了,直接贴代码,有问题请看10,11,章 //测试代码public static void main(String[] args) throws IOException {Link ...

  3. 卜若的代码笔记-数据结构系列-第十章:栈一.顺序栈(数组栈)

    1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈. 1.1栈的操作 1.1.1 出栈pop()函数 允许栈出,栈出之后,顶数据有移除操作. 时间复杂度o(1) 1.1.2 入栈 ...

  4. 卜若的代码笔记-unityshader系列-第十七章:Shader练习.遮罩(Shader采样Image的Sprite)

    1.遮罩的意义,就是让某个颜色的部分透明,其他的不透明. 实现思路很简单,但如果你是从这个系列一步一步上学过来的,那肯定很简单啦 1.1我们先定义一个标准Shader,然后慢慢改 Shader &qu ...

  5. 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现

    写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...

  6. (头冷巨制)数据结构学习日志2——(初级掉发向)--关于顺序表.单链表的核心操作实现(By Ivan小黄)

    又是在千家万户熟睡的深夜,老夫依然坐在寝室的硬椅子上,点一支烟(并没有),手指在键盘之间舞动,一根根发丝随着空调冷风从头皮缓缓剥落-咳咳····好了不贫啦!来来来,我们乖乖写完博客睡觉觉哈~ 今天带来 ...

  7. 卜若的代码笔记-matlab系列-matlab基础教程-第二章:静态变量

    persistent value; if isempty(value)value=20; endvalue=value+1;y=value; 注意,这段代码只允许定义在function里面

  8. 卜若的代码笔记-算法系列-第2个算法案例分析:HHM预测模型分析

    1. 关于这个模型就去看 https://www.cnblogs.com/pinard/p/6991852.html 这篇博客吧...我主要是将这个它的那个案例画了一张图 案例代码: package ...

  9. 卜若的代码笔记-unityshader系列-第八章:复杂Mesh

    这一章我们讲复杂的mesh为下一章的材质准备一些材料 8.1 创建一个矩形面片 本质就是绘制两个三角形面片,如图8-1.其代码有注释了就不做太多解释了. public virtual Mesh cre ...

最新文章

  1. CLLocationManager 位置定位
  2. “我想要用我余生,换夜空繁星闪耀”
  3. 如何自定义SAP Spartacus店铺的购物车图表css风格
  4. Hadoop小知识点
  5. Mathematica .nb程序运行不下去的原因
  6. Rainbow Tables
  7. SpringBoot系列(4):构建一个多模块SpringBoot项目
  8. FLUKE 754过程校准器带HART协议
  9. 自由浮动时间与总浮动时间
  10. 基于springboot老年人健康体检系统(带论文)
  11. CAT监控系统搭建与使用(V3.0.0)
  12. 【洛谷】P1138 第k小整数
  13. 服务器物理安装,安装Nano Server物理服务器Hyper-V角色
  14. sql server实现简繁转换
  15. TP-LINK如何设置Wifi无线上网短信认证?
  16. 云计算基础2-什么是云存储?
  17. windows下查看dll或exe的位数
  18. zf2 路由跳转方法
  19. [WIKI] SAP Solution Manager连接BI 4.0
  20. UVC驱动外接摄像头

热门文章

  1. 小米9的屏幕是三星EA8076
  2. 阿里云向物流业渗透 货运司机受益
  3. 零基础如何自学MySQL?
  4. 玩客云(Linux)工具
  5. 【GCN】在NLP中应用GCN的几种构图方法整理
  6. UE4.26像素流送之公网部署(自建TURN服务器)
  7. 瑞芯微电子RockChip(RK3588)
  8. 华为P20背后的秘密武器
  9. 福禄克FLUKE 810振动测试仪与福禄克FLUKE 830激光对中仪
  10. 【seeprettyface.com】高颜值人脸生成·诞生篇