愤怒中的小草

博客园 首页 新随笔 联系 订阅 管理

No Picture say Plane!

用数组描述的链表称为静态链表,表现形式为结构体数组,包括数据域data和游标curr。

基础理解

第一幅插入元素图解分析

第二幅图删除元素图解分析

 code

public class Element {
    public int data;
    public int cur;

    public Element(int data,int cur){
        this.data = data;
        this.cur = cur;
    }
}
结点
public class StaticLinkList {
    //静态链表的最大长度
    private int MAX_SIZE = 10;
    //链表的长度
    private int size = 0;
    //静态链表头结点下标
    private int head;

    Element[] element;

    public void initStaticLinkList(){
        element = new Element[MAX_SIZE];
        //数组下标为零的元素 当前节点为1
        for(int i = 0;i < MAX_SIZE - 1;i++){
            element[i] = new Element(0,i+1);
        }

        //最后一个数组元素的下标为0,表示指向当前的节点
        element[MAX_SIZE - 1] = new Element(0,0);
    }

    //插入数据
    public void add(int data){
        if(size == 0){
            head = element[0].cur;

            //当前结点的游标赋值给头结点
            element[0].cur = element[size+1].cur;
            element[size+1].data = data;
            element[size+1].cur = element[MAX_SIZE - 1].cur;

            element[MAX_SIZE - 1].cur = head;
            size ++;
        }
        else{
            //存放头结点的游标
            head = element[0].cur;

            /*最重要的感觉莫过于这段逻辑
            * 找静态链表的最后一个节点的数组下标,赋值其头结点的游标*/
            int i = 1,temp;
            while (i < MAX_SIZE){
                temp = element[i].cur;
                if(temp == 0)
                    break;
                i++;
            }
            element[i].cur = head;

            //当前结点的游标赋值给头结点
            element[0].cur = element[size+1].cur;

            element[size+1].data=data;
            element[size+1].cur=0; //最后一个插入节点的游标永远为0

            size ++;
        }
    }

    public String get(int i){
        //第一个元素指向备用元素的下标
        return "数组的下标:" + i + " 元素的值:" + element[i].data + "  指向的备用元素的下标:" + element[i].cur;
    }

    //index是数组的下标  从1开始
    public void delete(int index){
        index = index + 1;
        if(size == 1){
            //存放头结点的游标
            head = element[0].cur;
            //获取第一个元素的下标
            int i = 0;
            while (element[i].cur != 0){
                i ++;
            }
            //第一个结点对应的下一个结点 赋值给尾结点的游标
            int k = element[i].cur;
            element[MAX_SIZE-1].cur=k;
            element[i].data=0;
            element[i].cur=head;
            element[0].cur=i;

            size --;
        }else if(size < MAX_SIZE -1 && size > 0)
        {
            //存放头结点的游标
            head = element[0].cur;
            //获取第一个元素的下标
            int i = 0;
            while (index != element[i].cur){
                i ++;
            }
            //第一个结点对应的下一个结点 赋值给尾结点的游标
            int k = element[i].cur;
            element[MAX_SIZE-1].cur=k;
            element[i].data=0;
            element[i].cur=head;
            element[0].cur=i;

            size --;
        }
    }
}
插入和删除
public class Demo {
    public static void main(String[] args){
        StaticLinkList slk = new StaticLinkList();
        slk.initStaticLinkList();
        slk.add(5);
        slk.add(80);
        slk.add(33);
        slk.add(47);
        slk.add(11);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------删除操作--------------------");
        slk.delete(1);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------删除第二个元素操作--------------------");
        slk.delete(2);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------删除第三个元素操作--------------------");
        slk.delete(3);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------删除第四个元素操作--------------------");
        slk.delete(4);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------删除第五个元素操作--------------------");
        slk.delete(5);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
        System.out.println("---------------再次插入元素--------------------");
        slk.add(5);
        slk.add(80);
        slk.add(33);
        slk.add(47);
        slk.add(11);
        for(int i=0;i<10;i++){
            System.out.println(slk.get(i));
        }
    }
}
测试类
数组的下标:0 元素的值:0  指向的备用元素的下标:6
数组的下标:1 元素的值:5  指向的备用元素的下标:2
数组的下标:2 元素的值:80  指向的备用元素的下标:3
数组的下标:3 元素的值:33  指向的备用元素的下标:4
数组的下标:4 元素的值:47  指向的备用元素的下标:5
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:1
---------------删除操作--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:1
数组的下标:1 元素的值:0  指向的备用元素的下标:6
数组的下标:2 元素的值:80  指向的备用元素的下标:3
数组的下标:3 元素的值:33  指向的备用元素的下标:4
数组的下标:4 元素的值:47  指向的备用元素的下标:5
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:2
---------------删除第二个元素操作--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:2
数组的下标:1 元素的值:0  指向的备用元素的下标:6
数组的下标:2 元素的值:0  指向的备用元素的下标:1
数组的下标:3 元素的值:33  指向的备用元素的下标:4
数组的下标:4 元素的值:47  指向的备用元素的下标:5
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:3
---------------删除第三个元素操作--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:3
数组的下标:1 元素的值:0  指向的备用元素的下标:6
数组的下标:2 元素的值:0  指向的备用元素的下标:1
数组的下标:3 元素的值:0  指向的备用元素的下标:2
数组的下标:4 元素的值:47  指向的备用元素的下标:5
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:4
---------------删除第四个元素操作--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:4
数组的下标:1 元素的值:0  指向的备用元素的下标:6
数组的下标:2 元素的值:0  指向的备用元素的下标:1
数组的下标:3 元素的值:0  指向的备用元素的下标:2
数组的下标:4 元素的值:0  指向的备用元素的下标:3
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:5
---------------删除第五个元素操作--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:5
数组的下标:1 元素的值:0  指向的备用元素的下标:6
数组的下标:2 元素的值:0  指向的备用元素的下标:1
数组的下标:3 元素的值:0  指向的备用元素的下标:2
数组的下标:4 元素的值:0  指向的备用元素的下标:3
数组的下标:5 元素的值:0  指向的备用元素的下标:4
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:0
---------------再次插入元素--------------------
数组的下标:0 元素的值:0  指向的备用元素的下标:4
数组的下标:1 元素的值:5  指向的备用元素的下标:6
数组的下标:2 元素的值:80  指向的备用元素的下标:1
数组的下标:3 元素的值:33  指向的备用元素的下标:2
数组的下标:4 元素的值:47  指向的备用元素的下标:3
数组的下标:5 元素的值:11  指向的备用元素的下标:0
数组的下标:6 元素的值:0  指向的备用元素的下标:7
数组的下标:7 元素的值:0  指向的备用元素的下标:8
数组的下标:8 元素的值:0  指向的备用元素的下标:9
数组的下标:9 元素的值:0  指向的备用元素的下标:5
View Code

耗费无数闹细胞,感觉这样容易理解

posted on 2019-04-21 22:34  愤怒中的小草  阅读(154)  评论(0编辑  收藏  举报