数据结构(三) Java实现静态链表的顺序新增、指定位置新增和删除
来源:互联网 发布:写吉他谱的软件 编辑:程序博客网 时间:2024/06/06 17:17
参照着大话数据结构中的思想,实现了一下静态链表的新增和删除,记录下来;
一:定义:
静态链表:用数组描述的链表,即称为静态链表。
图 1 -1
图 1-2
如图所示:静态链表有几个关键点:
(1).静态链表每个实际元素由数据和cur两部分组成
(2).静态链表的首元素和尾元素都不存储实际的数据元素;
(3).首元素cur存储备用链表的元素的下标,尾元素cur存储第一个有效元素的下标;最后一个有效元素的cur指向0
二:演示:
1.新增前链表可见图1-2:
新增后:演示的是向指定位置处新增元素,此处是index =3,即向乙和丁之间插入一个丙
图 1 - 3
插入后可见:
思路:
(1.).找到带插入索引前一个元素,获取到此时的cur值和下标tmp
(2).获取此时首元素存储的cur:备用链表的下标,也是此时待插入元素的下标 -- newCur
(3).将前一个元素的cur指向此时待插入元素的下标 -- newCur;
(4).将待插入元素的cur指向原来前一个元素的cur值,tmp
(5)将首元素存储的cur 变成原来的值+1;
/** * 向指定位置插入数据 1.先将带插入的这个放在备用链表的第一条,记做k,然后将首元素的游标指向备用链表的下一个的下标k+1 * 2.不在第一条的情况:插入前index-1的位置list[index-1].cur = list[k]的下标 * 3.list[k]的游标指向原来第三个位置处的坐标 * * @param index * @param element * @return */public boolean addTo(int index, Object element) {if (index < -1 || index > length || element == null) {return false;}// 备用链表的第一个元素下标,也是待插入元素位置的下标newcurint newCur = linklist[0].cur;// 拿到前一个元素的下标int ccur = linklist.length - 1;// 获取第一个有效元素的下标for (int i = 1; i < index; i++) {ccur = linklist[ccur].cur;}// 出来后ccur=2int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccurlinklist[newCur] = new Node(tmp, element);linklist[0].cur = newCur + 1;length++;return true;}
2.删除
(1).找出删除位置的前一个元素的cur,也就是删除位置的下标tmp;
(2)根据tmp获取删除位置的cur,用来赋值给前一个元素的cur
(3)获取首元素的cur,也就是删除前备用链表的第一个位置的下标newfree;
(4)将删除元素的cur设置成newFree;将首元素的cur设置成删除元素的下标;代表这个删除位置已经到备用链表中的第一个位置,下次新增优先插到这个地方;
/** * 1.找出前一个元素的cur ,也就是删除位置元素的下标 --- 并将前一个元素的cur指向删除索引的后一个元素的下标 * 2.删除的这个索引处元素进入备用链表的第一个,cur指向原来的备用链表第一个下标,首元素cur指向该索引处元素下标 * * @param index * @return */public boolean delete(int index) {// 以index = 1为例if (index < -1 || index > length) {return false;}int ccur = size - 1;for (int i = 1; i < index; i++) {ccur = linklist[ccur].cur;}int tmp = linklist[ccur].cur;// 获取前一个元素的cur,也就是删除元素的下标int newCur = linklist[tmp].cur;// 获取删除元素的curlinklist[ccur].cur = newCur;int newFree = linklist[0].cur;// 获取原来链表的备用链表的第一个坐标linklist[0].cur = tmp;// 将首元素的cur设置成删除位置处的下标linklist[tmp].cur = newFree;size--;return true;}
下面是所有的代码
public class StaticLinkList {// 定义一个大的长度int size = 1000;Node[] linklist;// 定义一个数组int length;//定义一个有效元素的长度;// 初始化一个大小为1000的静态链表StaticLinkList() {linklist = new Node[1000];for (int i = 0; i < size - 1; i++) {linklist[i] = new Node(i + 1, null);}linklist[size - 1] = new Node(0, null);// 最后一个元素的角标指向第一个有值元素的下标}// 顺序新增元素public boolean add(Object element) {// 插入前备用链表首元素游标,也是新元素的下标int newCur = linklist[0].cur;// 保存当前最新的元素的游标int temp = linklist[newCur].cur;// 封装到node中Node newNode = new Node(0, element);linklist[newCur] = newNode;// 假如新增元素前就有实际元素,那么新增后需要将之前的最后一个元素的cur置为新增后最后一个元素的下标if (linklist[0].cur > 1) {linklist[newCur - 1].cur = newCur;}// 将temp赋值给首元素的cur;linklist[0].cur = temp;// 将列表最后一个元素的游标置为首个有效元素的下标linklist[size - 1].cur = 1;length++;return true;}/** * 向指定位置插入数据 1.先将带插入的这个放在备用链表的第一条,记做k,然后将首元素的游标指向备用链表的下一个的下标k+1 * 2.不在第一条的情况:插入前index-1的位置list[index-1].cur = list[k]的下标 * 3.list[k]的游标指向原来第三个位置处的坐标 * * @param index * @param element * @return */public boolean addTo(int index, Object element) {if (index < -1 || index > length || element == null) {return false;}// 备用链表的第一个元素下标,也是待插入元素位置的下标newcurint newCur = linklist[0].cur;// 拿到前一个元素的下标int ccur = linklist.length - 1;// 获取第一个有效元素的下标for (int i = 1; i < index; i++) {ccur = linklist[ccur].cur;}// 出来后ccur=2int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccurlinklist[newCur] = new Node(tmp, element);linklist[0].cur = newCur + 1;length++;return true;}public boolean delete(int index){}static class Node {int cur;Object element;Node(int cur) {this.cur = cur;}Node(int cur, Object element) {this.cur = cur;this.element = element;}}public static void main(String[] args) {StaticLinkList list = new StaticLinkList();for (int i = 0; i < 4; i++) {if (i == 0) {list.add("甲");}if (i == 1) {list.add("乙");}if (i == 2) {list.add("丁");}if (i == 3) {list.add("午");}}list.addTo(3, "丙");System.out.println(list);}}
阅读全文
0 0
- 数据结构(三) Java实现静态链表的顺序新增、指定位置新增和删除
- mysql新增字段、注释、指定位置新增字段、删除字段。
- c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
- 【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
- 在javaScript中实现table列的新增和删除
- 数据结构(一)-顺序存储结构的插入和删除:向指定位置的数组插入和删除元素
- 数据结构之头指针链表的逆序、输出和指定位置的删除
- ES6新增的数据结构
- js动态新增/删除table表的行和列
- 数据结构中静态顺序表的初始化、尾插、尾删、头插、头删、任意位置的插入及删除
- js 新增和删除表格
- Solr 删除和新增 index
- 简单顺序表的插入,删除,指定位置,指定元素的插入删除操作
- jq运用append和remove实现动态新增删除行
- java 8 与 java 7 , 包 与 类 新增和删除的对比
- 一个实现数据增量加载的ETL算法(记录新增、更新和删除标志)
- GridView的编辑、新增、删除
- 表格的新增以及和删除一行数据(可以新增原有数据)
- PPT组件 Spire.Presentation V2.8.49发布|支持将PPT转换为HTML和TIFF
- 杭电OJ_(2041)超级阶梯
- Python 日期和时间
- Genymotion + VirtualBox mac android studio 安卓模拟器 安装遇到的问题
- js
- 数据结构(三) Java实现静态链表的顺序新增、指定位置新增和删除
- mysql忽略主键冲突、避免重复插入的几种方式
- java环境搭建
- 区分python中*args和**kargs
- DOS “运行” 快速打开相关软件命令
- ubuntu 16.10 如何安装ldtp
- Mint安装
- django 远程连接mysql数据库,表变更
- Linux基础练习二