美文网首页
Java实现静态链表

Java实现静态链表

作者: 糖醋排骨盐酥鸡 | 来源:发表于2019-03-24 21:36 被阅读0次

    今天复习到静态链表。自己简单实现了静态链表的基本操作,记录一下

    
    /**
     * @DESCRIPTION TODO
     * @DATE 2019年3月23日 下午9:08:11
     * @AUTHOR tmooming
     */
    public class SNode<T> {
        public T data;
        private int cursor;
    
        public SNode() {
    
        }
    
        public SNode(T data, int cursor) {
            this.data = data;
            this.cursor = cursor;
        }
    
        public T getData() {
            return data;
        }
    
        public void setData(T data) {
            this.data = data;
        }
    
        public int getCursor() {
            return cursor;
        }
    
        public void setCursor(int cursor) {
            this.cursor = cursor;
        }
    
        @Override
        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append(getData());
            sb.append(" ");
            sb.append(getCursor() + " ");
            return sb.toString();
    
        }
    }
    
    /**
     * @DESCRIPTION TODO
     * @DATE 2019年3月23日 下午9:08:23
     * @AUTHOR tmooming
     */
    public class SList<T> {
        SNode<T>[] node;
        private static final int MAX_SIZE = 15;
        private int length;
    
        public SList() {
            node = new SNode[MAX_SIZE];
            for (int i = 0; i < MAX_SIZE - 1; i++) {
                node[i] = new SNode<T>(null, i + 1);
            }
            node[MAX_SIZE - 1] = new SNode<>(null, 0);
            this.length = 0;
        }
    
        // 实际数组长度
        public int Length() {
            return length;
        }
    
        // 判断使用数组是否为空
        public boolean isEmpty() {
            return length == 0;
        }
    
        // 判断备用链表是否为空
        public boolean isFull() {
            return length == MAX_SIZE;
        }
    
        // 插入一个节点
        public boolean addTo(T data, int index) {
            if (isFull() || index > MAX_SIZE || index < -1 || data == null)
                return false;
            if (index == 0) {
                insert(data);
                return true;
            }
            if (index > Length()) {
                index = Length();
            }
            // 获取第一个使用节点的下标
            int firstUse = node[MAX_SIZE - 1].getCursor();
            // 获取备用数组第一个节点的下标
            int firstNull = node[0].getCursor();
            for (int i = 1; i < index; i++) {
                firstUse = node[firstUse].getCursor();
            }
            // 获取目标节点的后续节点
            int nextUse = node[firstUse].getCursor();
            int nextNull = node[firstNull].getCursor();
            node[0].setCursor(nextNull);
            node[firstUse].setCursor(firstNull);
            node[firstNull].setCursor(nextUse);
            node[firstNull].setData(data);
            length++;
            return true;
    
        }
    
        public void insert(T data) {
            int t = node[MAX_SIZE - 1].getCursor();
            int firstNull = node[0].getCursor();
            node[MAX_SIZE - 1].setCursor(firstNull);
            node[0].setCursor(node[firstNull].getCursor());
            node[firstNull].setCursor(t);
            node[firstNull].setData(data);
            length++;
        }
    
        public void print() {
            int first = node[MAX_SIZE - 1].getCursor();
            System.out.println("链表:");
            for (int i = first; i != 0;) {
                System.out.print(node[i].getData() + " ");
                i = node[i].getCursor();
            }
    
        }
    
        // 删除指定节点
        public boolean delete(T data) {
            if (isEmpty()) {
                return false;
            }
            int temp = MAX_SIZE - 1;
            while (temp != 0) {
                if (node[node[temp].getCursor()].getData() == data) {
                    int p = node[temp].getCursor();
                    node[temp].setCursor(node[p].getCursor());
                    node[p].setCursor(node[0].getCursor());
                    node[0].setCursor(p);
                    node[p].setData(null);
                    length--;
                    return true;
                }
                temp = node[temp].getCursor();
            }
            return false;
        }
    
        // 删除所有节点
        public boolean deleteAll() {
            if (isEmpty()) {
                return true;
            }
            for (int i = 0; i < MAX_SIZE - 1; i++) {
                node[i].setCursor(i + 1);
                node[i].setData(null);
            }
            node[MAX_SIZE - 1].setCursor(0);
            node[MAX_SIZE - 1].setData(null);
            length = 0;
            return true;
        }
    
        public void printAll() {
    
            System.out.println("链表:");
            for (int i = 0; i < MAX_SIZE; i++) {
                System.out.print("[" + i + " " + node[i].getData() + " " + node[i].getCursor() + "]");
                if (i % 5 == 0 && i != 0) {
                    System.out.println();
                }
    
            }
    
        }
    
        public static void main(String[] args) {
            SList<String> list = new SList<String>();
            list.insert("赵");
            list.insert("钱");
            list.insert("李");
            // list.printAll();
            // list.addTo("孙", 5);
            list.deleteAll();
            System.out.println(list.Length());
            list.printAll();
    
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Java实现静态链表

          本文链接:https://www.haomeiwen.com/subject/oblomqtx.html