zoukankan      html  css  js  c++  java
  • 线性表之链表实现

    链表我们可以看成一列火车,有车头,有结点,首先,我们先定义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

  • 相关阅读:
    css3---2D效果 ---3D效果
    PHP 代 码 操 作 文 件
    文件上传
    在AJAX里 使用【 XML 】 返回数据类型 实现简单的下拉菜单数据
    在AJAX里 使用【 JSON 】 返回数据类型 实现简单的下拉菜单数据
    使用 AJAX + 三级联动 实现分类出全国各地的省,市,区
    AJAX里使用的弹窗样式 tanchuang.js tanchuang.css
    jquery-1.11.2.min.js
    使用【 ajax 】【 bootstrap 】显示出小窗口 详情内容 一些代码意思可以参考下一个文章
    AJAX基本操作 + 登录 + 删除 + 模糊查询
  • 原文地址:https://www.cnblogs.com/du001011/p/10520252.html
Copyright © 2011-2022 走看看