• 线性表之链表实现


    链表我们可以看成一列火车,有车头,有结点,首先,我们先定义Sequence接口,它里面包含一些基本的增删查改等方法,然后我们定义SequenceLinkImpl类用来实现Sequnece接口

    下面先写出Sequence接口的一些方法:

    public interface Sequence {
        
        /**
         * 向线性表中添加元素
         * @param date   要存储的元素
         */
        void add(Object data);
        
        /**
         * 线性表中删除元素
         * @param index   要删除的元素下标
         * @return  是否删除成功
         */
        boolean remove(int index);
        
        /**
         * 在线性表中查找指定下标的元素
         * @param index   要查找的索引
         * @return
         */
        Object get(int index);
        
        /**
         * 判断线性表中是否有指定元素
         * @param data   要查找的元素内容
         * @return
         */
        boolean contains(Object data);
        
        /**
         * 修改线性表中指定索引的内容
         * @param index   要修改元素下标
         * @param newData  修改后的内容
         * @return
         */
        Object set(int index,Object newData);
        
        /**
         * 返回当前线性表的长度
         * @return
         */
        int size();
        
        /**
         * 清空线性表内容
         */
        void clear();
        
        /**
         * 将线性表转为数组
         * @return
         */
        Object[] toArray();
    }

    下面是接口方法具体实现,在SequenceLinkImpl类中先定义内部类Node,

    内部类Node:

    class Node{
            Node next;
            Object data;
            public Node(Node next, Object data) {
                super();
                this.next = next;
                this.data = data;
            }
            public Node(Object data) {
                super();
                this.data = data;
            }
            
        }

    SequenceLinkImpl类的成员属性和构造器

    private Node head;
        private int size;
        
        public SequenceLinkImpl() {
            this.head = new Node(null,null);
        }

    SequenceLinkImpl类的成员方法:

    成员方法addLast方法和addFirst方法实现:

    private void addFirst(Object data) {
            add(0,data);
        }
        private void addLast(Object data) {
            add(size,data);
        }

     

    成员方法add(int,Object)方法实现:

    //在任意位置添加
        public void add(int index,Object data) {
            rangeCheck(index);
            Node prev = head;
            for(int i = 0;i<index;i++) {
                prev = prev.next;
            }
            Node newNode = new Node(data);
            newNode.next = prev.next;
            prev.next = newNode;
            size++;
        }

    成员方法rangeCheck实现

    //判断index是否合法
        private void rangeCheck(int index) {
            if(index<0||index>size) {
                throw new IndexOutOfBoundsException("Illegal Index!");
            }
        }

    成员方法node实现

    //找到index的当前结点
        private Node node(int index) {
            Node prev = head.next;
            for(int i = 0;i<index;i++) {
                prev = prev.next;
            }
            return prev;
        }

    add方法实现:

    public void add(Object data) {
            addLast(data);
        }

    remove方法实现:

    public boolean remove(int index) {
            rangeCheck(index);
            Node prev = head;
            for(int i = 0;i<index;i++) {
                prev = prev.next;
            }
            //获取当前index的结点
            Node now = node(index);
            prev.next = now.next;
            now.next = now = null;
            size--;
            return true;
        }

    contains方法实现:

    public boolean contains(Object data) {
            Object[] arr = toArray();
            if(data == null) {
                for(int i = 0;i<arr.length;i++) {
                    if(arr[i] == null) {
                        return true;
                    }
                }
            }else {
                for(int i = 0;i<arr.length;i++) {
                    if(data.equals(arr[i])) {
                        return true;
                    }
                }
            }
            return false;
        }

    get方法实现:

    public Object get(int index) {
            rangeCheck(index);
            return node(index).data;
        }

    set方法实现:

    public Object set(int index, Object newData) {
            rangeCheck(index);
            Node node = node(index);
            Object oldData = node.data;
            node.data = newData;
            return oldData;
        }

    size方法实现:

    public int size() {
            return size;
        }

    clear方法实现:

    public void clear() {
            for(Node node = head.next;node!=null;) {
                node.data = null;
                Node tmp = node.next;
                node.next = null;
                node = tmp;
                size--;
            }
            
        }

    toArray方法实现:

    public Object[] toArray() {
            Object[] arr = new Object[size];
            int index = 0;
            for(Node node = head.next;node!=null;node = node.next) {
                arr[index++] = node.data;
            }
            return arr;
        }

    链表就是上面代码实现:下面附上详细代码地址:

    https://github.com/dukaichao/DataStructure/tree/master/dkc_ds_0312

  • 相关阅读:
    tp框架自带扩展分页类修改样式
    win7获取管理员权限
    Git学习手记(二)
    安卓导出安装包
    浅谈存储过程
    Java宝典
    单例设计模式
    关于Cookie的有关内容
    开辟html5和css3学习随笔(2015-3-2)
    关于面试题
  • 原文地址:https://www.cnblogs.com/du001011/p/10520252.html
Copyright © 2020-2023  润新知