【笔记】数据结构

1.数据结构与算法——从零开始学习(一)基础概念篇
2. 大话数据结构 – 整理归纳(1)
3. Java数据结构


线性表

public interface List<T> {

    public void add(T t);

    public void insert(T t, int index);

    public T remove(int index);

    public boolean isEmpty();

    public T get(int index);

    public void validate(int index);

    public int size();

}

顺序线性表

/**
 * 顺序线性表
 * 底层由数组实现,存取速度快(通过下标直接获取),插入删除慢(需要扩容缩容)
 * @param <T>
 */
public class ArrayList<T> implements List<T> {

    public Object[] objects = {};

    private int size;

    public ArrayList() {
    }

    public ArrayList(int len) {
        objects = new Object[len];
    }

    @Override
    public void add(T t) {
        size++;
        objects = Arrays.copyOf(objects, size);
        objects[size - 1] = t;
    }

    public void insert(T t, int index) {
        if (index < 0 || index > size) {
            throw new RuntimeException();
        }

        size++;
        objects = Arrays.copyOf(objects, size + 1);
        System.arraycopy(objects, index, objects, index + 1,
                size - index - 1);
        objects[index] = t;
    }

    public T remove(int index) {
        validate(index);
        T t = (T) objects[index];
        System.arraycopy(objects, index + 1, objects, index,
                size - index - 1);
        size--;
        objects = Arrays.copyOf(objects, size);
        return t;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    public T get(int index) {
        validate(index);
        return (T) objects[index];

    }

    public void validate(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException();
        }
    }

    public int size() {
        return size;
    }

}

单链表

/**
 * 单链表存储结构
 * @param <E>
 */
@Getter
public class SingleNode<E> {

    private E item;

    private SingleNode<E> next;

    public SingleNode(E element) {
        this.item = element;
    }

    public SingleNode(SingleNode<E> next, E element) {
        this.item = element;
        this.next = next;
    }

    public static <E> void addData(E element, SingleNode head) {

        //初始化要加入的节点
        SingleNode newNode = new SingleNode(element);
        //临时节点
        SingleNode temp = head;
        // 找到尾节点
        while (temp.next != null) {
            temp = temp.next;
        }
        // 已经包括了头节点.next为null的情况了~
        temp.next = newNode;
    }

}

双向链表

/**
 * 双向链表
 * @param <E>
 */
public class Node<E> {

    E item;

    Node<E> next;

    Node<E> prev;

    Node(E element) {
        this.item = element;
    }

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.prev = prev;
        this.next = next;
    }

}
/**
 * 双向链表
 * @param <T>
 */
public class LinkedList<T> implements List<T> {

    transient Node<T> first;

    transient Node<T> last;

    private int size;

    @Override
    public void add(T t) {
        final Node<T> l = last;
        final Node<T> temp = new Node<>(l, t, null);
        last = temp;
        if (l == null) {
            first = temp;
        } else {
            l.next = temp;
        }
        size++;
    }

    @Override
    public void insert(T t, int index) {
        // 获取index的节点
        Node<T> temp = getNode(index);
        // 创建新节点
        Node nodeNew = new Node(temp.prev, t, temp);
        temp.prev.next = nodeNew;
        temp.prev = nodeNew;

        size++;
    }

    @Override
    public T remove(int index) {
        // 获取index的节点
        Node<T> temp = getNode(index);
        temp.prev.next = temp.next;
        temp.next.prev = temp.prev;
        size--;
        return temp.item;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public T get(int index) {
        Node<T> temp = getNode(index);
        return temp.item;
    }

    private Node<T> getNode(int index) {
        Node<T> temp;
        validate(index);
        if (index > size / 2) {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.prev;
            }

        } else {
            temp = first;
            for (int i = 1; i <= index; i++) {
                temp = temp.next;
            }
        }
        return temp;
    }

    @Override
    public void validate(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException();
        }
    }

    @Override
    public int size() {
        return size;
    }

    public T getFirst() {
        final Node<T> f = first;
        if (f == null) {
            throw new RuntimeException();
        }
        return f.item;
    }

    public T getLast() {
        final Node<T> f = last;
        if (f == null) {
            throw new RuntimeException();
        }
        return f.item;
    }

}

public class Stack<T> implements List<T> {

    private Node<T> top;

    private Node<T> bottom;

    private int size;

    public Stack() {
    }

    public Stack(Node top, Node bottom) {
        this.top = top;
        this.bottom = bottom;
    }

    @Override
    public void add(Object o) {
        Node<T> t = top;
        Node<T> newNode = new Node(null, o, t);

        top = newNode;
        if (t == null) {
            bottom = newNode;

        } else {
            t.prev = newNode;
        }
        size++;

    }

    @Override
    public void insert(T t, int index) {
        // 获取index的节点
        Node<T> temp = getNode(index);
        // 创建新节点
        Node nodeNew = new Node(temp.prev, t, temp);
        temp.prev.next = nodeNew;
        temp.prev = nodeNew;

        size++;
    }

    @Override
    public T remove(int index) {
        // 获取index的节点
        Node<T> temp = getNode(index);
        temp.prev.next = temp.next;
        temp.next.prev = temp.prev;
        size--;
        return temp.item;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public T get(int index) {
        Node<T> node = getNode(index);

        return node.item;
    }

    @Override
    public void validate(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException();
        }
    }

    @Override
    public int size() {
        return size;
    }

    public T getTop() {
        final Node<T> f = top;
        if (f == null) {
            throw new RuntimeException();
        }
        return f.item;
    }

    public T getBottom() {
        final Node<T> f = bottom;
        if (f == null) {
            throw new RuntimeException();
        }
        return f.item;
    }

    private Node<T> getNode(int index) {
        Node<T> temp;
        validate(index);
        if (index > size / 2) {
            temp = top;
            for (int i = size - 1; i > index; i--) {
                temp = temp.next;
            }

        } else {
            temp = bottom;
            for (int i = 1; i <= index; i++) {
                temp = temp.prev;
            }
        }
        return temp;
    }

}

二叉树

线索二叉树

/**
 * 二叉树
 *
 * 中序遍历
 * 先访问根节点,然后访问左节点,最后访问右节点(根->左->右)
 * 先序遍历
 * 先访问左节点,然后访问根节点,最后访问右节点(左->根->右)
 * 后序遍历
 * 先访问左节点,然后访问右节点,最后访问根节点(左->右->根)
 *
 * @param <E>
 */
@Data
public class TreeNode<E> {

    TreeNode<E> leftNode;

    E item;

    TreeNode<E> rightNode;

    public TreeNode() {
    }

    public TreeNode(E item) {
        this.item = item;
    }

    public TreeNode(TreeNode<E> leftNode, E item, TreeNode<E> rightNode) {
        this.leftNode = leftNode;
        this.item = item;
        this.rightNode = rightNode;
    }

    /**
     *      10
     * 9        20
     *      15      35
     */
    /**
     * 如果是中序遍历:10->9->20->15->35
     *
     * 如果是先序遍历:9->10->15->20->35
     * 解释:访问完10节点过后,去找的是20节点,但20下还有子节点,因此先访问的是20的左节点15节点。
     * 由于15节点没有子节点了。所以就返回20节点,访问20节点。最后访问35节点
     *
     * 如果是后序遍历:9->15->35->20->10
     * 解释:先访问9节点,随后应该访问的是20节点,但20下还有子节点,因此先访问的是20的左节点15节点。
     * 由于15节点没有子节点了。所以就去访问35节点,由于35节点也没有子节点了,所以返回20节点,最终返回10节点
     *
     * @param treeNode
     */
    public static void inTraverseBTree(TreeNode treeNode) {
        if (treeNode != null) {
            System.out.println(treeNode);
            //访问左节点
            inTraverseBTree(treeNode.getLeftNode());
            //访问右节点
            inTraverseBTree(treeNode.getRightNode());
        }

    }

    @Override
    public String toString() {
        return item.toString();
    }

}

测试

public class Test1 {

    public static void main(String[] args) {
//        test(new ArrayList());
//        test(new LinkedList());
//        test(new Stack());

        testTreeNode();
    }

    public static void testSingleNode() {

        SingleNode<String> node = new SingleNode<String>("1");
        for (int i = 2; i < 6; i++) {
            SingleNode.addData(i + "", node);
        }
        SingleNode temp = node;
        while (temp.getNext() != null) {
            System.out.println(temp.getItem());
            temp = temp.getNext();
        }
    }

    public static void test(List list) {
        System.out.println(list.size());
        System.out.println(list.isEmpty());
        for (int i = 1; i < 6; i++) {
            list.add(i + "");
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + ",");
        }
        System.out.println();

        list.insert("7", 2);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + ",");
        }
        System.out.println();

        list.remove(4);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + ",");
        }
        System.out.println();
        System.out.println(list.size());
        System.out.println(list.isEmpty());

        if (list instanceof LinkedList) {
            System.out.println(((LinkedList) list).getFirst());
            System.out.println(((LinkedList) list).getLast());
        }
        if (list instanceof Stack) {
            System.out.println(((Stack) list).getTop());
            System.out.println(((Stack) list).getBottom());
        }
        System.out.println();

    }

    /**
     *      10
     * 9        20
     *       15      35
     */
    public static void testTreeNode() {

        //根节点-->10
        TreeNode treeNode1 = new TreeNode(10);
        //左-->9
        TreeNode TreeNode = new TreeNode(9);
        //右-->20
        TreeNode treeNode3 = new TreeNode(20);
        //20的左-->15
        TreeNode treeNode4 = new TreeNode(15);
        //20的右-->35
        TreeNode treeNode5 = new TreeNode(35);

        treeNode1.setLeftNode(TreeNode);
        treeNode1.setRightNode(treeNode3);

        treeNode3.setLeftNode(treeNode4);
        treeNode3.setRightNode(treeNode5);

        TreeNode.inTraverseBTree(treeNode1);

    }

}
发布了37 篇原创文章 · 获赞 0 · 访问量 1139

猜你喜欢

转载自blog.csdn.net/qq_25046005/article/details/104255125
今日推荐