静态链表

静态链表的创建及其插入删除

静态链表是指创建一个固定长度的对象数组,用来模拟链表进行使用,既能够实现数组的按照索引快速访问,也能实现链表的碎片式插入与删除。(图表截取小甲鱼教学视频)
在这里插入图片描述

静态链表含有三个元素,游标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);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值