最近在研究数据结构,非常眼馋C中的指针,但是在Java中没有这个,只有对象的引用,虽然也可以说间接实现了指针的某些作用,但是还是觉得不太过瘾,进而发现了有静态链表这种用数组来代替指针,来描述单链表。所以我打算用java写一下试试:
//数组中的对象
public class StaticLinkList {
Object data; //相当于数据域
int cur; //相当于指针域(游标)
}
public class InitList {
public void InitList(StaticLinkList[] space){
/*
* 在静态链表中:
* 1.把数组的第一个和最后一个元素作为特殊元素处理,不存数据(第一个和最后一个相当于转换站)
* 头结点的游标存放第一个空闲分量的下标,而尾节点的游标则是存放第一个插入元素的下标(相当于第一指针的下标)
* 2.未被使用的数组元素称为备用链表
* */
for (int i = 0; i < space.length; i++) {
space[i].cur = i+1; //使得游标和索引产生联系(space[i].cur可以看做头指针,space[i]可以当做头结点)
}
space[space.length-1].cur = 0; //目前静态链表为空,最后一个元素的cur为0
}
}
//静态链表的插入操作
public class ListInsert {
//会返回第一个空闲分量的下标
public int Malloc_SLL(StaticLinkList[] space){
int i = space[0].cur; //头结点的游标是第一个空闲分量的下标
if(space[0].cur > 0){ //空闲下标不是头结点的时候
space[0].cur = space[i].cur; //由于要拿出来使用一个空闲分量,所以我们用下一个分量当作空闲备用
}
return i;
}
//返回L中数据的个数
public int ListLength(StaticLinkList[] L){
int j = 0;
int i = L[L.length-1].cur;
while (i > 0){
i = L[i].cur;
j++;
}
return j;
}
//在L中第i个元素之前插入新的数据元素
public void LisInsert(StaticLinkList[] L, int i, Object e){
int j , k , l;
k = L.length - 1; //k是最后一个元素的下标
if(i < 1 || i > ListLength(L) + 1){ //判断i是否合法
System.out.println("输入的i不在链表内!");
}
j = Malloc_SLL(L);
if(j > 0){
L[j].data = e; //数据域赋值
for(l = 1 ; l <= i ; l++){ //找到第i个元素之前的位置
k = L[k].cur;
}
L[j].cur = L[k].cur; //将
L[k].cur = j;
}
}
}