zoukankan      html  css  js  c++  java
  • 静态链表

    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

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

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/mutong1228/p/10747489.html
Copyright © 2011-2022 走看看