Java写插入静态链表

最近在研究数据结构,非常眼馋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;
        }
    }
}

Java写插入静态链表_第1张图片

你可能感兴趣的:(Java写插入静态链表)