数据结构(三) 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
原创粉丝点击