新手的数据结构练习——可能是线性表

来源:互联网 发布:网络连接怎么设置 编辑:程序博客网 时间:2024/04/29 00:04
作为学习数据结构的新手,用JAVA练习写了一个链表,想问问各位dalao都有什么不足?
package dataStructureSamples;import java.io.Flushable;import java.util.Iterator;/** * 这可能是一个链表。 * @author Miko * * @param <T> 设定泛型以支持存储各种数据。 */public class LinkList<T> implements Iterable<T>, Flushable{    /**     * <p>链表现长度,每当一个新元素被添加进来,这个值就会加1,每当一个元素被删除,值就会减1。</p>     * @see <code>{@link #addElement(T t)}</code>     * @see <code>{@link #removeElements(int index)}</code>     */    public int listLength = 0;    /**     * 链表的节点。     * @author Miko     *     * @param <E> 链表的节点当然也需要泛型。     */    private class Node<E> implements Iterator<T>{        /**         * 节点元素。         */        private transient E item;        /**         * 上一个节点。         */        private transient Node<E> prev;        /**         * 下一个节点。         */        private transient Node<E> next;        /**         * 伪指针。         */        private transient Node<E> pointer;        /**         * 空构造方法         */        public Node() {}        /**         * 构造方法。         * @param item         * @param prev         * @param next         */        public Node(E item,Node<E> prev, Node<E> next) {            this.item = item;            this.prev = prev;            this.next = next;            pointer = new Node<E>();            pointer.setNext(this);        }        public E getItem() {            return item;        }//      public void setItem(E item) {//          this.item = item;//      }        public Node<E> getPrev() {            return prev;        }        public void setPrev(Node<E> prev) {            this.prev = prev;        }        public Node<E> getNext() {            return next;        }        public void setNext(Node<E> next) {            this.next = next;        }        @Override        public boolean hasNext() {            return (pointer.next != null);        }        @SuppressWarnings("unchecked")        @Override        public T next() {            pointer = pointer.next;            return (T) pointer.item;        }        /**         * 销毁该节点。         */        public void destroy(){            this.prev = null;            this.next = null;            this.item = null;            try {                super.finalize();                System.out.println("节点销毁。");            }catch(Throwable e) {                System.out.println("对象无需销毁。");            }        }        @Override        protected void finalize() {            try {                super.finalize();                System.out.println("节点对象销毁。");            }catch(Throwable e) {                System.out.println("对象无需销毁。");            }        }    }    private Node<T> first;    private Node<T> current = new Node<T>();    private Node<T> last;    /**     * 增加链表的元素,会将<code>{@link #listLength}</code>增加1。     * @param t     * @return flag     */    public int addElement(T t) {        if(listLength == 0) {            Node<T> self = new Node<T>(t, null, null);            first = self;            last = self;        }else {            Node<T> self = new Node<T>(t, last, null);            last.setNext(self);            last = self;        }        listLength++;        return 1;    }    /**     * 删除某个元素,会将<code>{@link #listLength}</code>减少1。     * @param index 要删除的元素索引。     * @return flag FLAG。     * @throws Throwable      */    public int removeElements(int index) throws Throwable {        if(listLength == 0) {            throw new NullPointerException("不能删除空链表中的元素。");        }else if(listLength <= index) {            throw new Exception("删除越界。");        }else {            Node<T> temp = first;            for(int i = 0;i < index; i++) {                temp = temp.getNext();            }            temp.getPrev().setNext(temp.getNext());            temp.getNext().setPrev(temp.getPrev());            temp.destroy();            temp = null;        }        listLength--;        try {            super.finalize();            System.out.println("对象销毁。");        }catch(Throwable e) {            System.out.println("对象无需销毁。");        }        return 1;    }    /**     * 获取随机存储的元素。     * @param index 要获取的元素索引。     * @return element     * @throws Exception     */    public T getElement(int index) throws Exception{        T t = null;        if(listLength == 0) {            throw new NullPointerException("无法从空链表中查询到元素。");        }else if(listLength <= index) {            throw new Exception("获取越界。");        }else {            Node<T> temp = first;            for(int i = 0;i < index;i++) {                temp = temp.getNext();            }            t = temp.getItem();            current = temp;            temp = null;        }        return t;    }    @Override    public Iterator<T> iterator() {        current = first;        return current;    }    @Override    public void flush() {        for(int i = 0;i < listLength;i++) {            Node<T> temp = last;            last = last.getPrev();            temp.destroy();            temp = null;        }        listLength = 0;        System.out.println("表已清空。");        try {            super.finalize();            System.out.println("对象销毁。");        }catch(Throwable e) {            System.out.println("对象无需销毁。");        }    }    @Override    protected void finalize() {        try {            super.finalize();            System.out.println("对象销毁。");        }catch(Throwable e) {            System.out.println("对象无需销毁。");        }    }}
原创粉丝点击