一、顺序表

​ 顺序表本质是使用数组储存数组的一种数据结构,在计算机的储存中是连续的分配内存的。

​ 下面是我自己使用java实现的简单顺序表结构

package list;

public class MyArrayList<E> {

    private Object[] data; //数据

    private int length; //目前长度

    private int size;  //容量

    //空构造器 默认容量10

    public MyArrayList(){

        this(10);

    }

    /**

     * 初始化表自定义容量

     * @param size

     */

    public MyArrayList(int size){

        if(size<0){

            throw new RuntimeException("定义表容量错误:"+size);

        }else {

            this.data = new Object[size];

            this.size = size;

            this.length = 0;

        }

    }

    /**

     * 判断容量是否足够,若不够则扩充10

     */

    public void SizeIsEnough(){

        if(this.length>=this.size){

            Object[] newData = new Object[this.size+10];

            this.size = size+10;

        }

    }

    /**

     * 向表末尾插入一个元素

     * @param e 插入的元素

     */

    public void add(E e){

        data[length++] = e;

    }

    /**

     *  向表的指定位置插入一个元素

     * @param e 插入元素的值

     * @param index 插入的位置

     */

    public void add(E e,int index){

        SizeIsEnough();

        if(index<0|| index>=length+1){

            throw  new RuntimeException("插入元素位置错误"+index);

        }

        for(int i=length++; i>=index; i--){

            data[i] = data[i-1];

        }

        data[index] = e;

    }

    /**

     * 移除指定位置的元素

     * @param index 移除元素的位置

     */

    public E remove(int index){

        if(index<0||index>=length){

            throw  new RuntimeException("删除元素位置错误"+index);

        }

        E e = Get(index);

        for(int i=index;i<--length;i++){

            data[i] = data[i+1];

        }

        return e;

    }

    /**

     *  移除最后一个元素

     * @return 返回被移除的元素

     */

    public E remove(){

        return remove(length-1);

    }

    /**

     *  获取指定位置的元素

     * @param index 获取元素的位置

     * @return 获取的元素的值

     */

    public E Get(int index){

        if(index<0||index>=length){

            throw  new RuntimeException("查找元素位置错误"+index);

        }

        E e = (E) data[index];

        return e;

    }

    /**

     * 获取指定值的元素的位置

     * @param e

     * @return

     */

    public int Get(E e){

        for(int i=0; i<length ;i++) {

            if (data[i].equals(e)) {

                return i;

            }

        }

        return -1;

    }

    public int Length() {

        return length;

    }

    public static void main(String[] args) {

        MyArrayList<String> list = new MyArrayList<>();

        list.add("ming");

        list.add("king");

        list.add("ling");

        for(int i=0;i<list.Length();i++){

            System.out.println(list.Get(i));

        }

        list.remove(2);

        list.add("ling",2);

        for(int i=0;i<list.Length();i++){

            System.out.println(list.Get(i));

        }

    }

}

二、链表

链表是本质上使用指针储存下一个元素的地址,从而可以在内存中找到下一个元素,形成一个链式的结构。java中没有指针的概念,当时java面向对象的本质就是指针,所以可以使用类作为指针的替代。

以下是我自己实现的简单的单链表

package list;

public class MyLinkList<E> {

    private Node<E> head=null;

    private int size=0;

    /**

     * 添加元素

     */

    public void  add(E e){

        Node<E> node = new Node<>();

        node.setData(e);

        if(head == null){

            head = node;

            size++;

            return;

        }

        assert false;

        Node<E> tmp = head;

        while (tmp.hasNext()){

            tmp = tmp.getNext();

        }

        tmp.setNext(node);

        size++;

    }

    /**

     * 删除指定位置的元素

     * @param index

     * @return

     */

    public E remove(int index){

        Node<E> tmp = head;

        Node<E> preNode;

        Node<E> currNode;

        int count=0;

        if(index < 0 || index >size-1){

            throw  new RuntimeException("删除位置错误"+index);

        }

        while (tmp.hasNext()&&count != index-1){

            tmp = tmp.getNext();

            count++;

        }

        preNode = tmp;

        currNode = tmp.getNext();

        assert currNode != null;

        preNode.setNext(currNode.getNext());

        size--;

        return currNode.getData();

    }

    public int Size(){

        return size;

    }

    /**

     * 移除链表尾部元素

     * @return

     */

    public E remove(){

        return remove(size-1);

    }

    /**

     * 获取指定位置的元素

     * @param index

     * @return

     */

    public E get(int index){

        Node<E> tmp = head;

        int count=0;

        if(index < 0 || index > size-1){

            throw  new RuntimeException("查找位置错误"+index);

        }

        while (tmp.hasNext() && count != index){

            tmp = tmp.getNext();

            count++;

        }

        return tmp.getData();

    }

    public static void main(String[] args) {

        MyLinkList<String> linked = new MyLinkList<>();

        linked.add("ming");

        linked.add("ling");

        linked.add("ping");

        linked.add("king");

        for (int i = 0; i < linked.size; i++) {

            System.out.println(linked.get(i));

        }

        String s = linked.remove();

        for (int i = 0; i < linked.size; i++) {

            System.out.println(linked.get(i));

        }

        System.out.println(s);

    }

}

class Node<E> {

    private E data;

    private Node<E> next = null;

    public E getData() {

        return data;

    }

    public void setData(E data) {

        this.data = data;

    }

    public Node<E> getNext() {

        return next;

    }

    public void setNext(Node<E> next) {

        this.next = next;

    }

    public boolean hasNext(){

        return next != null;

    }

}

实现线性表有两种方式。第一种是使用外汇返佣http://www.fx61.com/数组存储线性表的元素。数组是动态创建的。超过数组的容量时,创建一个新的更大的数组,并且将当前数组中的元素复制到新建的数组中。另一种方法是用链表结构实现。链表由节点组成,每个结点都是动态生成的,用来存储一个元素。所有的结点连接成一个线性表。

本文讲述使用变长数组实现线性表

实现代码

package com.billJiang.array;

import java.util.Arrays;

import java.util.Collection;

/**

 * Created by billJiang on 2016/11/30.

 * 变长数组

 */

public class ArrayList<T> {

    private static final int INITIAL_SIZE = 10;

    private int size = 0;

    private T[] array;

    public ArrayList(int initial) {

        if (initial <= 0)

            initial = INITIAL_SIZE;

        array = (T[]) new Object[initial];

    }

    public void add(T item) {

        //数组扩容

        if (size == array.length) {

            array = Arrays.copyOf(array, size * 2);

        }

        array[size++] = item;

    }

    public T get(int index) {

        if (index >= size || index < 0) {

            throw new IndexOutOfBoundsException("获取的元素超出了数组的界限");

        }

        return array[index];

    }

    public T set(int index, T item) {

        T oldItem = this.get(index);

        array[index] = item;

        return oldItem;

    }

    public int size() {

        return this.size;

    }

}

测试代码

package com.billJiang.array;

/**

 * Created by billJiang on 2016/11/30.

 */

public class ArrayListTest {

    public static void main(String[] args) {

        ArrayList<Integer> arrayList=new ArrayList<Integer>(3);

        arrayList.add(new Integer(1));

        arrayList.add(new Integer(2));

        arrayList.add(new Integer(3));

        System.out.println(arrayList.size());

        arrayList.add(new Integer(4));

        arrayList.set(3,5);

        System.out.println(arrayList.size());

    }

}

10-17 14:01