《大话数据结构》线性表的链式存储结构
时间:2022-07-26
本文章向大家介绍《大话数据结构》线性表的链式存储结构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 什么是线性表的链式存储
前面我们看过线性表的顺序存储结构,他是通过数组开辟一段连续的地址空间来实现的,在做插入操作和删除操作时,因为要维护数组的结构所以时间复杂度为O(N);有什么办法可以解决删除和插入操作效率低的办法吗?没错就是链表,我们只需要在保存当前数据的同时,也保存其下一个元素的地址就行了,这样在删除和修改时实际上并不需要维护结构,只需要改变被删除或被插入数据上一个的地址指向和下一个的地址指向即可。
原使用顺序存储时的结构如下。
使用链表存储时的结构如下。
2. 优缺点
通过上图可以看出在插入数据或删除数据时效率明显高于顺序存储结构,但是你可能发现了在查找时链式存储结构效率是低于顺序存储结构的,原因是在查找时必须遍历链表依次去拿下一个的地址值才能找到对应的数据。所有在插入数据和删除数据时链式存储结构效率高于顺序存储结构而查找低于顺序存储结构,在Java中我们都知道ArrayList是基于数组的,而LinkedList基于链表,所以在查找比较多的时候我们应该使用ArrayList,而插入和删除比较多的时候应该使用LikedList。
3. 使用Java代码实现链式存储
package com.bigcat;
/** * 单向链表,实现新增,插入,获取,删除操作 * @author damao * @date 2019/11/12 */public class MyLinkedList<T>{
private static Node PREV_ADDRESS = null;
private Node<T> firstNode;
private static int size = 0;
public Boolean add(T t){ if (PREV_ADDRESS == null) { PREV_ADDRESS = firstNode = new Node(null,t); }else{ Node<T> node = new Node(null, t); PREV_ADDRESS = PREV_ADDRESS.next = node; } size++; return true; }
public Boolean add(int index,T t){ if(index <= 0){ throw new RuntimeException("Index must be greater than zero"); } if(index == 1){ firstNode = new Node(firstNode.next,t); return true; } Node<T> prev = null; Node<T> theNode = firstNode; for (int i = 1; i <= index; i++) { if(index == i){ Node<T> node = new Node(theNode,t); prev.next = node; return true; } prev = theNode; theNode = theNode.next; } return true; }
public T get(int index){ if(index <= 0){ throw new RuntimeException("Index must be greater than zero"); } if(index > size){ throw new RuntimeException("Exceeded maximum index stored"); } Node<T> theNode = firstNode; for (int i = 1; i <= index; i++) { if(index == i){ return theNode.value; } theNode = theNode.next; } return null; }
public Boolean remove(int index){ if(index <= 0){ throw new RuntimeException("Index must be greater than zero"); } if(index > size){ throw new RuntimeException("Exceeded maximum index stored"); } if(index == 1){ firstNode = firstNode.next; return true; } Node<T> prev = null; Node<T> theNode = firstNode; for (int i = 1; i <= index; i++) { if(index == i){ prev.next = theNode.next; theNode.next = null; return true; } prev = theNode; theNode = theNode.next; } return false; }
private static class Node<T>{ Node<T> next; T value; public Node(Node<T> next, T value) { this.next = next; this.value = value; } }
}
测试结果如下
- 一条SQL语句的执行计划变化探究(r10笔记第9天)
- 【Go 语言社区】Web 通信 之 长连接、长轮询(long polling)--转
- Dubbo入门-协议;注册中心
- Oracle 12c PDB浅析(二)(r8笔记第29天)
- 【Go 语言社区】在 Go 语言中,如何正确的使用并发
- Data Guard高级玩法:通过闪回恢复failover备库 (r10笔记第7天)
- ajax跨域问题-web开发必会
- 在线重定义的补充测试(r10笔记第26天)
- 聊聊Data Guard中的DG Broker(r10笔记第24天)
- stuts2返回json数据简单实现
- Linux命令ssh-copy-id (r10笔记第21天)
- 【Go 语言社区】HTML5 canvas验证码识别
- 迁移式升级的测试(二)(r10笔记第35天)
- Golang实现图片缩放服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法