卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表
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;}
}
测试结果:
至于其他骚操作嘛...哎,太简单了,随便弄就行。
卜若的代码笔记-数据结构系列-第三章:链表-最简单的线性表:单链表相关推荐
- 卜若的代码笔记-webgl系列-第三章:几何渲染Rendering Geometry
1 在webgl里面表述几何体最关键的两种数据类型: 顶点和索引(vertices and indices.) 1.1 顶点是什么? 顶点定义了3D对象的角点,每一个顶点由三个元素组成x,y,z. 在 ...
- 卜若的代码笔记-数据结构系列-第十二章:栈三.链栈
1.太简单了,不介绍了,直接贴代码,有问题请看10,11,章 //测试代码public static void main(String[] args) throws IOException {Link ...
- 卜若的代码笔记-数据结构系列-第十章:栈一.顺序栈(数组栈)
1.栈有两种写法,一种是以数组为躯干的顺序栈,一种是以链表为躯干的链式栈. 1.1栈的操作 1.1.1 出栈pop()函数 允许栈出,栈出之后,顶数据有移除操作. 时间复杂度o(1) 1.1.2 入栈 ...
- 卜若的代码笔记-unityshader系列-第十七章:Shader练习.遮罩(Shader采样Image的Sprite)
1.遮罩的意义,就是让某个颜色的部分透明,其他的不透明. 实现思路很简单,但如果你是从这个系列一步一步上学过来的,那肯定很简单啦 1.1我们先定义一个标准Shader,然后慢慢改 Shader &qu ...
- 数据结构_Java_基于 线性表-单链表的初始化、逆序、去重、非递减序列的合并(开辟新链表先整体插入一个链表全部元素,再遍历另外一个链表寻找合适位置插入 、开辟新链表实现舍弃原链表)等操作实现
写在前面 不久前学习了数据结构线性表-数组-链表的相关知识,用C/C++语言实现了 单链表的系列相关操作 .见往期博客: 数据结构实验2_C语言_基于顺序表的非递减有序表的合并.线性表元素的增.删.改 ...
- (头冷巨制)数据结构学习日志2——(初级掉发向)--关于顺序表.单链表的核心操作实现(By Ivan小黄)
又是在千家万户熟睡的深夜,老夫依然坐在寝室的硬椅子上,点一支烟(并没有),手指在键盘之间舞动,一根根发丝随着空调冷风从头皮缓缓剥落-咳咳····好了不贫啦!来来来,我们乖乖写完博客睡觉觉哈~ 今天带来 ...
- 卜若的代码笔记-matlab系列-matlab基础教程-第二章:静态变量
persistent value; if isempty(value)value=20; endvalue=value+1;y=value; 注意,这段代码只允许定义在function里面
- 卜若的代码笔记-算法系列-第2个算法案例分析:HHM预测模型分析
1. 关于这个模型就去看 https://www.cnblogs.com/pinard/p/6991852.html 这篇博客吧...我主要是将这个它的那个案例画了一张图 案例代码: package ...
- 卜若的代码笔记-unityshader系列-第八章:复杂Mesh
这一章我们讲复杂的mesh为下一章的材质准备一些材料 8.1 创建一个矩形面片 本质就是绘制两个三角形面片,如图8-1.其代码有注释了就不做太多解释了. public virtual Mesh cre ...
最新文章
- CLLocationManager 位置定位
- “我想要用我余生,换夜空繁星闪耀”
- 如何自定义SAP Spartacus店铺的购物车图表css风格
- Hadoop小知识点
- Mathematica .nb程序运行不下去的原因
- Rainbow Tables
- SpringBoot系列(4):构建一个多模块SpringBoot项目
- FLUKE 754过程校准器带HART协议
- 自由浮动时间与总浮动时间
- 基于springboot老年人健康体检系统(带论文)
- CAT监控系统搭建与使用(V3.0.0)
- 【洛谷】P1138 第k小整数
- 服务器物理安装,安装Nano Server物理服务器Hyper-V角色
- sql server实现简繁转换
- TP-LINK如何设置Wifi无线上网短信认证?
- 云计算基础2-什么是云存储?
- windows下查看dll或exe的位数
- zf2 路由跳转方法
- [WIKI] SAP Solution Manager连接BI 4.0
- UVC驱动外接摄像头