Java实现链表(数据结构)

数据结构——java实现链表

/**
 * @author Lotus_dong
 * @create 2020-12-21 9:56
 * @function 链表:真正的动态数组
 */
public class MyLinked<T> {
    
    
    /*创建节点,使用内部类*/
    private class Node<T> {
    
    
        /*节点元素*/
        T element;

        /*下一个节点*/
        Node next;

        /**
         * 创建节点,添加值,下一个指向next
         *
         * @param element 节点元素值
         */
        public Node(T element) {
    
    
            this.element = element;
            this.next = next;
        }

        /**
         * 默认无参的创建方式,节点为空
         */
        public Node() {
    
    
            this(null);
        }

        /**
         * 创建节点,添加元素,指定下一个节点
         *
         * @param element 元素
         * @param next    下一个节点
         */
        public Node(T element, Node next) {
    
    
            this.element = element;
            this.next = next;
        }

        /**
         * 返回节点
         *
         * @return 返回节点元素
         */
        @Override
        public String toString() {
    
    
            return this.element.toString();
        }
    }

    /*链表长度*/
    private int size;
    /*设置虚拟头节点*/
    private Node dummyNode;

    /**
     * 默认无参的创建虚拟头节点,size=0,虚拟头节点为空
     */
    public MyLinked() {
    
    
        this.size = 0;
        this.dummyNode = new Node(null, null);
    }

    /*对链表的操作*/

    /**
     * 返回链表的长度
     * @return int型,size=链表长度
     */
    public int getSize() {
    
    
        return size;
    }

    /**
     * 判断链表是否为空,若size==0,则为空
     * @return true为空,false不为空
     */
    public boolean isEmpty() {
    
    
        return size == 0;
    }

    /**
     * 向链表头部添加元素
     * @param element 头部节点
     */
    public void addHead(T element) throws IllegalAccessException {
    
    
        addIndex(element,0);
    }

    /**
     * 向链表中指定位置添加节点
     * @param element 节点元素
     * @param index 指定索引位置
     */
    public void addIndex(T element,int index) throws IllegalAccessException {
    
    
        Node node = new Node(element);
        if (node == null){
    
    
            throw new IllegalAccessException("node is null!!!");
        }
        if (index < 0 || index > size) {
    
    
            throw new IllegalAccessException("Index is error!!!");
        }
        Node prev = dummyNode;
        for (int i = 0; i < index; i++) {
    
    
            prev = prev.next;
        }
        //插入操作
        node.next = prev.next;
        prev.next = node;
        size++;
    }

    /**
     * 向链表末尾添加节点
     * @param element 节点元素
     */
    public void addLast(T element) throws IllegalAccessException {
    
    
        addIndex(element,size);
    }

    /**
     * 获取头节点元素
     * @return 返回头节点元素
     */
    public T getHead() {
    
    
        //返回头结点元素,若为空则返回null,不为空返回element
        return dummyNode == null ? null : (T) dummyNode.next.element;
    }

    /**
     * 返回指定索引位置的节点元素
     * @param index 指定索引位置
     * @return 返回指定索引位置的节点元素
     */
    public T getIndex(int index) throws IllegalAccessException {
    
    
        if (index < 0 || index >= size) {
    
    
            throw new IllegalAccessException("index is error!!!");
        }
        Node prev = dummyNode.next;
        for (int i = 0; i < index; i++) {
    
    
            prev = prev.next;
        }
        return prev == null ? null : (T)prev.element;
    }

    /**
     * 获取最后一个索引位置的节点元素
     * @return 返回最后一个索引位置的节点元素
     */
    public T getLast() throws IllegalAccessException {
    
    
        return getIndex(size-1);
    }

    /**
     * 判断链表中是否包含指定元素
     * @param element 指定元素
     * @return 包含返回true,不包含返回false
     */
    public boolean contains(T element) {
    
    
        boolean flag = false;
        Node prev = dummyNode.next;
        while (prev != null) {
    
    
            if (prev.element.equals(element)) {
    
    
                return true;
            }
            prev = prev.next;
        }
        return flag;
    }

    /**
     * 修改指定位置节点元素
     * @param index 指定索引位置
     * @param element 指定元素
     * @return 返回被修改的节点元素
     * @throws IllegalAccessException 索引越界,抛出异常
     */
    public T setIndex(int index,T element) throws IllegalAccessException {
    
    
        if (index < 0 || index >= size) {
    
    
            throw new IllegalAccessException("index is error");
        }
        Node prev = dummyNode.next;
        for (int i = 0; i < index; i++) {
    
    
            prev = prev.next;
        }
        T ele = (T)prev.element;
        prev.element = element;
        return ele;
    }

    /**
     * 删除指定位置节点
     * @param index 指定索引位置
     * @return 返回被删除的指定索引位置的节点元素
     * @throws IllegalAccessException 索引越界,抛出异常
     */
    public T remove(int index) throws IllegalAccessException {
    
    
        if (index < 0 || index >= size) {
    
    
            throw new IllegalAccessException("index is error");
        }
        Node prev = dummyNode;
        for (int i = 0; i < index; i++) {
    
    
            prev = prev.next;
        }
        T ele = (T) prev.next.element;
        prev.next = prev.next.next;
        size--;
        return ele;
    }
    @Override
    public String toString() {
    
    
        StringBuffer sb = new StringBuffer();
        Node prev = dummyNode.next;
        while (prev != null) {
    
    
            sb.append(prev.element+"-->");
            prev = prev.next;
        }
        sb.append("null");
        return sb.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/Lotus_dong/article/details/111473013
今日推荐