静态链表的创建及其插入删除
静态链表是指创建一个固定长度的对象数组,用来模拟链表进行使用,既能够实现数组的按照索引快速访问,也能实现链表的碎片式插入与删除。(图表截取小甲鱼教学视频)
静态链表含有三个元素,游标cur,数据data,以及下标
静态链表中下标为0和下标为Maxsize-1的位置不存放数据,其中下标为0的cur用来标记第一个空位置的下标,Maxsize-1的cur用来标记第一个元素的下标,便于插入删除时使用,例如新插入元素的位置就是第一个空位置的下标,而如果要进行遍历,则需要从第一个元素开始遍历,E为最后一个元素,因此他的游标指向0,意味着遍历结束。
具体代码如下:
结构体定义
public class StaticList {
//游标cur指向下标
int cur;
Object data;
int Maxsize=100;
静态链表的初始化,注: staticList[i]= new StaticList();以及
staticList[Maxsize-1]=new StaticList();是必要的,不然会出现空指针异常
public void StaticList(StaticList[] staticList){
for(int i = 0; i<Maxsize-1; i++){
staticList[i]= new StaticList();
//创建新类对象作为结点
staticList[i].cur=i+1;
}
staticList[Maxsize-1]=new StaticList();
staticList[Maxsize-1].cur=0;
//staticList[0].cur指向第一个空元素
//staticList[Maxsize-1].cur指向第一个有元素的位置
}
按顺序进行数据添加
public void StaticList_add(StaticList[] staticLists,Object data){
int i;
int k=Maxsize-1;
i=staticLists[0].cur;
System.out.println("添加前第一个空位置为"+i);
staticLists[i].data=data;
System.out.println("添加的数据为"+data);
staticLists[0].cur=staticLists[i].cur;
staticLists[i].cur=0;
if(i!=1){
for(int j=1;j<i;j++){
k=staticLists[k].cur;
}}
staticLists[k].cur=i;
//add方法为顺序添加,因此如果staticList[maxsize-1].cur!=0就不需要改变
if(staticLists[Maxsize-1].cur==0){
staticLists[Maxsize-1].cur=1;
}
System.out.println("添加完成");
System.out.println("此时第一个有元素的位置为"+staticLists[Maxsize-1].cur);
}
测试结果:
数据插入:
插入方式与链表几乎相同,staticLists[i].cur=staticLists[k].cur;
staticLists[k].cur=i;
public void StaticList_insert(StaticList[] staticLists,int n,Object data){
int i;//标记第一个空位置的下标
int k= Maxsize-1;//标记插入位置的前驱结点的下标
i=staticLists[0].cur;
staticLists[i].data=data;
staticLists[0].cur=staticLists[i].cur;
if(n!=1){
for(int j=1;j<=n-1;j++){
k= staticLists[k].cur;
}
}
System.out.println("插入位置为"+i);
staticLists[i].cur=staticLists[k].cur;
staticLists[k].cur=i;
System.out.println("前驱结点的后继为"+staticLists[k].cur);
System.out.println("插入结点的后继为"+staticLists[i].cur);
System.out.println("插入完成");
}
运行结果:
删除结点:删除的位置按照遍历的顺序
public void StaticList_delete(StaticList[] staticLists,int n){
if(staticLists[n].data==null){
System.out.println("该结点为空");
}
int k=Maxsize-1;//用来查找其前驱结点
if(n!=1){
for(int i=1;i<=n-1;i++){
k= staticLists[k].cur;
}
}
System.out.println("删除的结点为"+n);
System.out.println("其数据为"+staticLists[staticLists[k].cur].data);
staticLists[staticLists[k].cur].data=null;
staticLists[k].cur=staticLists[staticLists[k].cur].cur;
//把删除的结点的cur赋给前驱结点的cur,即将前结点与后结点连接起来
//将删除的结点归为备用链表
if(n<staticLists[0].cur){//如果删除位置小于第一个空位置
//将原第一个空元素的位置赋给删除结点的cur,作为其后继结点,并将删除位置n赋给staticLists[0].cur
statciLists[n].cur=staticLists[0].cur;
staticLists[0].cur=n;
}
System.out.println("删除完成");
}
运行结果:
打印链表
public void staticList_print(StaticList[] staticLists){
int k=Maxsize-1;
while(staticLists[k].cur!=0){
k=staticLists[k].cur;
System.out.print("下标为:"+k);
System.out.println(",");
System.out.println("data:"+staticLists[k].data);
}
System.out.println("输出完成");
System.out.println("---------------------------");
}
完整代码:
public class StaticList {
//游标cur指向下标
int cur;
Object data;
int Maxsize=100;
public void StaticList(StaticList[] staticList){
for(int i = 0; i<Maxsize-1; i++){
staticList[i]= new StaticList();
staticList[i].cur=i+1;
}
staticList[Maxsize-1]=new StaticList();
staticList[Maxsize-1].cur=0;
//staticList[0].cur指向第一个空元素
//staticList[Maxsize-1].cur指向第一个有元素的位置
}
public void StaticList_add(StaticList[] staticLists,Object data){
int i;
int k=Maxsize-1;
i=staticLists[0].cur;
System.out.println("添加前第一个空位置为"+i);
staticLists[i].data=data;
System.out.println("添加的数据为"+data);
staticLists[0].cur=staticLists[i].cur;
staticLists[i].cur=0;
if(i!=1){
for(int j=1;j<i;j++){
k=staticLists[k].cur;
}}
staticLists[k].cur=i;
//add方法为顺序添加,因此如果staticList[maxsize-1].cur!=0就不需要改变
if(staticLists[Maxsize-1].cur==0){
staticLists[Maxsize-1].cur=1;
}
System.out.println("添加完成");
System.out.println("此时第一个有元素的位置为"+staticLists[Maxsize-1].cur);
}
public void StaticList_insert(StaticList[] staticLists,int n,Object data){
int i;//标记第一个空位置的下标
int k= Maxsize-1;//标记插入位置的前驱结点的下标
i=staticLists[0].cur;
staticLists[i].data=data;
staticLists[0].cur=staticLists[i].cur;
if(n!=1){
for(int j=1;j<=n-1;j++){
k= staticLists[k].cur;
}
}
System.out.println("插入位置为"+i);
staticLists[i].cur=staticLists[k].cur;
staticLists[k].cur=i;
System.out.println("前驱结点的后继为"+staticLists[k].cur);
System.out.println("插入结点的后继为"+staticLists[i].cur);
System.out.println("插入完成");
}
public void StaticList_delete(StaticList[] staticLists,int n){
if(staticLists[n].data==null){
System.out.println("该结点为空");
}
int k=Maxsize-1;//用来查找其前驱结点
if(n<staticLists[0].cur){//如果删除位置小于第一个空位置
staticLists[0].cur=n;
}
if(n!=1){
for(int i=1;i<=n-1;i++){
k= staticLists[k].cur;
}
}
System.out.println("删除的结点为"+n);
System.out.println("其数据为"+staticLists[staticLists[k].cur].data);
staticLists[staticLists[k].cur].data=null;
staticLists[k].cur=staticLists[staticLists[k].cur].cur;
System.out.println("删除完成");
}
public void staticList_print(StaticList[] staticLists){
int k=Maxsize-1;
while(staticLists[k].cur!=0){
k=staticLists[k].cur;
System.out.print("下标为:"+k);
System.out.println(",");
System.out.println("data:"+staticLists[k].data);
}
System.out.println("输出完成");
System.out.println("---------------------------");
}
public static void main(String[] args){
StaticList sl=new StaticList();
StaticList[] staticList = new StaticList[sl.Maxsize];
sl.StaticList(staticList);
sl.StaticList_add(staticList,1);
sl.StaticList_add(staticList,2);
sl.StaticList_add(staticList,3);
sl.staticList_print(staticList);
sl.StaticList_insert(staticList,2,5);
sl.staticList_print(staticList);
sl.StaticList_delete(staticList,2);
sl.staticList_print(staticList);
}
}