参照着大话数据结构中的思想,实现了一下静态链表的新增和删除,记录下来;
一:定义:
图 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;
}
// 备用链表的第一个元素下标,也是待插入元素位置的下标newcur
int newCur = linklist[0].cur;
// 拿到前一个元素的下标
int ccur = linklist.length - 1;// 获取第一个有效元素的下标
for (int i = 1; i < index; i++) {
ccur = linklist[ccur].cur;
}
// 出来后ccur=2
int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)
linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)
linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccur
linklist[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;// 获取删除元素的cur
linklist[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;
}
// 备用链表的第一个元素下标,也是待插入元素位置的下标newcur
int newCur = linklist[0].cur;
// 拿到前一个元素的下标
int ccur = linklist.length - 1;// 获取第一个有效元素的下标
for (int i = 1; i < index; i++) {
ccur = linklist[ccur].cur;
}
// 出来后ccur=2
int tmp = linklist[ccur].cur;//存储原来前一个元素的cur == 3(此时为3)
linklist[ccur].cur = newCur;// 将原来之前有个元素的游标设置为新插入的元素位置的下标(newcur)
linklist[newCur].cur = tmp;// 将新插入的这个元素的下标设置为插入前,index元素前一个元素的游标ccur
linklist[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);
}
}