zoukankan      html  css  js  c++  java
  • MyLinkedList

    注:

      简单的测试了下,基本操作没什么问题。我是直接实现了List<E>和Deque<E>接口,因为这样实现的方法比较全面,也不必自己去设计一个抽象父类,比较简单。代码中有只实现了常用的部分方法,觉得LinkedList<E>里面方法是在太多了,而且很多功能都是重复的(感觉接口设计的不是很好)。

    package soul.demo.lists;
    
    import java.util.Collection;
    import java.util.Deque;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    
    class MyLinkedList<E> implements List<E>, Deque<E> {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    //        new MyLinkedList.Node<String>(null,null,null);
        }
        
        private Node<E> firstNode=null;
        private Node<E> lastNode=null;
        private int size=0;
        
        
        @SuppressWarnings("hiding")
        private class Node<E>{
            E element;
            Node<E> pre;
            Node<E> next;
            
            Node(Node<E> _pre,E _element,Node<E> _next){
                this.pre=_pre;
                this.element=_element;
                this.next=_next;
            }
        }
    //    private static class Node<E> {
    //        E item;
    //        Node<E> next;
    //        Node<E> prev;
    //
    //        Node(Node<E> prev, E element, Node<E> next) {
    //            this.item = element;
    //            this.next = next;
    //            this.prev = prev;
    //        }
    //    }
        /**
         * 构造一个空列表
         */
        MyLinkedList(){
            
        }
        
        /**
         * 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列
         * @param c
         */
        MyLinkedList(Collection<? extends E> c){
            
        }
        
        /**
         * 将指定元素插入此列表的开头
         */
        @Override
        public void addFirst(E e) {
            // TODO Auto-generated method stub
            firstNode=addNode(null,e,firstNode);
        }
        
        /**
         * 将指定元素添加到此列表的结尾
         */
        @Override
        public void addLast(E e) {
            // TODO Auto-generated method stub
            addNode(lastNode,e,null);
        }
        
        /**
         * 增加元素,凡是单个增加元素节点都通过该方法
         * @param pre
         * @param e
         * @param next
         * @return
         */
        private Node<E> addNode(Node<E> pre,E e,Node<E> next){
            Node<E> newNode=new Node<E>(pre,e,next); 
            if(size==0){
                firstNode=newNode;
                lastNode=newNode;
            }
            if(next==null){
                lastNode.next=newNode;
                lastNode=newNode;
                
            }
            if(pre==null){
                firstNode.pre=newNode;
                firstNode=newNode;
            }
            size++;
            return newNode;
        }
        /**
         * 在此列表的开头插入指定的元素
         */
        @Override
        public boolean offerFirst(E e) {
            // TODO Auto-generated method stub
            addFirst(e);
            return true;
        }
    
        /**
         *  在此列表末尾插入指定的元素
         */
        @Override
        public boolean offerLast(E e) {
            // TODO Auto-generated method stub
            addLast(e);
            return true;
        }
    
        /**
         *  移除并返回此列表的第一个元素
         */
        @Override
        public E removeFirst() {
            // TODO Auto-generated method stub
            Node<E> oldFirst=firstNode;
            firstNode=firstNode.next;
            return removeNode(oldFirst);
        }
    
        /**
         * 移除单个元素  凡是单个移除动作都要经过该方法
         * @param e
         * @return
         */
        private E removeNode(Node<E> node){
            node.pre.next=node.next;
            node.next.pre=node.pre;
            size--;
            return node.element;
        }
        @Override
        /**
         * 移除并返回该列表的最后一个元素
         * @return
         */
        public E removeLast() {
            // TODO Auto-generated method stub
            Node<E> oldLast=lastNode;
            lastNode=oldLast.pre;
            return removeNode(oldLast);
        }
    
        /**
         * 获取并移除此列表的第一个元素;如果此列表为空,则返回 null
         */
        @Override
        public E pollFirst() {
            // TODO Auto-generated method stub
            return removeFirst();
        }
    
        /**
         * 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null
         */
        @Override
        public E pollLast() {
            // TODO Auto-generated method stub
            return removeLast();
        }
    
        /**
         * 返回此列表的第一个元素
         */
        @Override
        public E getFirst() {
            // TODO Auto-generated method stub
            return firstNode.element;
        }
    
        /**
         * 返回此列表的最后一个元素
         */
        @Override
        public E getLast() {
            // TODO Auto-generated method stub
            return lastNode.element;
        }
    
        /**
         * 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null
         */
        @Override
        public E peekFirst() {
            // TODO Auto-generated method stub
            return getFirst();
        }
    
        /**
         * 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null
         */
        @Override
        public E peekLast() {
            // TODO Auto-generated method stub
            return getLast();
        }
    
        /**
         * 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)
         * @param o
         * @return
         */
        @Override
        public boolean removeFirstOccurrence(Object o) {
            // TODO Auto-generated method stub
            return false;
        }
    
        /**
         * 从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)
         */
        @Override
        public boolean removeLastOccurrence(Object o) {
            // TODO Auto-generated method stub
            return false;
        }
    
        /**
         * 将指定元素添加到此列表的末尾(最后一个元素)
         */
        @Override
        public boolean offer(E e) {
            // TODO Auto-generated method stub
            addLast(e);
            return true;
        }
    
        /**
         * 获取并移除此列表的头(第一个元素)
         */
        @Override
        public E remove() {
            // TODO Auto-generated method stub
            return removeFirst();
        }
    
        /**
         *  获取并移除此列表的头(第一个元素)
         */
        @Override
        public E poll() {
            // TODO Auto-generated method stub
            return removeFirst();
        }
    
        /**
         * 获取但不移除此列表的头(第一个元素)
         */
        @Override
        public E element() {
            // TODO Auto-generated method stub
            return getFirst();
        }
    
        /**
         * 获取但不移除此列表的头(第一个元素)
         */
        @Override
        public E peek() {
            // TODO Auto-generated method stub
            return getFirst();
        }
    
        /**
         *  将元素推入此列表所表示的堆栈
         */
        @Override
        public void push(E e) {
            // TODO Auto-generated method stub
            addFirst(e);
        }
        
        /**
         * 从此列表所表示的堆栈处弹出一个元素(第一个)
         */
        @Override
        public E pop() {
            // TODO Auto-generated method stub
            return removeFirst();
        }
    
        /**
         * 返回以逆向顺序在此双端队列的元素上进行迭代的迭代器
         */
        @Override
        public Iterator<E> descendingIterator() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public ListIterator<E> listIterator(int index) {
            // TODO Auto-generated method stub
            return null;
        }
    
        /**
         * 返回此列表的元素数
         */
        @Override
        public int size() {
            // TODO Auto-generated method stub
            return size;
        }
    
        /**
         * 将指定元素添加到此列表的结尾
         */
        public boolean add(E e){
            addLast(e);
            return true;
        }
        
        /**
         * 在此列表中指定的位置插入指定的元素
         */
        public void add(int index,E element){
            //检查index
            Node<E> needNode=firstNode;
            for(int i=0;i<index-1;i++){
                needNode=needNode.next;
            }
            Node<E> newNode=addNode(needNode.pre,element,needNode);
            needNode.pre.next=newNode;
            needNode.pre=newNode;
        }
        
        /**
         * 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序
         */
        public boolean addAll(Collection<? extends E> c){
            return false;
        }
        
        /**
         * 将指定 collection 中的所有元素从指定位置开始插入此列表
         */
        public boolean addAll(int index,Collection<? extends E> c){
            return false;
        }
        
        /**
         * 从此列表中移除所有元素
         */
        public void clear(){
            for (Node<E> x = firstNode; x != null; ) {
                Node<E> next = x.next;
                x.element = null;
                x.next = null;
                x.pre= null;
                x = next;
            }
            firstNode = lastNode = null;
            size = 0;
        }
        
        /**
         * 返回此 LinkedList 的浅表副本
         */
        public Object clone(){
            return null;
        }
    
        @Override
        public boolean isEmpty() {
            // TODO Auto-generated method stub
            return size==0;
        }
    
        /**
         * 如果此列表包含指定元素,则返回 true
         */
        @Override
        public boolean contains(Object o) {
            // TODO Auto-generated method stub
            return false;
        }
    
        
        @Override
        public Iterator<E> iterator() {
            // TODO Auto-generated method stub
            return new Itr();
        }
    
        private class Itr implements Iterator<E>{
    
            private Node<E> _nextNode=firstNode;
            
            @Override
            public boolean hasNext() {
                // TODO Auto-generated method stub
                return _nextNode!=null;
            }
    
            @Override
            public E next() {
                // TODO Auto-generated method stub
                E _e=null;
                if(hasNext()){
                    _e=_nextNode.element;
                    _nextNode=_nextNode.next;
                }
                    
                
                return _e;
            }
            
        }
        /**
         * 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组
         */
        @Override
        public Object[] toArray() {
            // TODO Auto-generated method stub
            return null;
        }
    
        /**
         * 返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组;返回数组的运行时
         * 类型为指定数组的类型。
         */
        @Override
        public <T> T[] toArray(T[] a) {
            // TODO Auto-generated method stub
            return null;
        }
    
        /**
         * 从此列表中移除首次出现的指定元素(如果存在)
         */
        @SuppressWarnings("unchecked")
        @Override
        public boolean remove(Object o) {
            // TODO Auto-generated method stub
            removeNode(eToNode((E)o,true));
            return true;
        }
    
        @Override
        public boolean containsAll(Collection<?> c) {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public boolean removeAll(Collection<?> c) {
            // TODO Auto-generated method stub
            return false;
        }
    
        @Override
        public boolean retainAll(Collection<?> c) {
            // TODO Auto-generated method stub
            return false;
        }
    
        /**
         * 返回此列表中指定位置处的元素
         */
        @Override
        public E get(int index) {
            // TODO Auto-generated method stub
            return indexToNode(index).element;
        }
    
        /**
         * 将此列表中指定位置的元素替换为指定的元素
         */
        @Override
        public E set(int index, E element) {
            // TODO Auto-generated method stub
            
            E oldE=indexToNode(index).element;
            E _oldE=oldE;
            oldE=element;
            return _oldE;
        }
    
        /**
         * 移除此列表中指定位置处的元素
         */
        @Override
        public E remove(int index) {
            // TODO Auto-generated method stub
            return removeNode(indexToNode(index));
        }
    
        /**
         * 返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1
         */
        @SuppressWarnings("unchecked")
        @Override
        public int indexOf(Object o) {
            // TODO Auto-generated method stub
            return eToIndex((E)o,true);
        }
    
        /**
         * 返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1
         */
        @SuppressWarnings("unchecked")
        @Override
        public int lastIndexOf(Object o) {
            // TODO Auto-generated method stub
            return eToIndex((E)o,false);
        }
    
        /**
         *  返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始
         */
        @Override
        public ListIterator<E> listIterator() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public List<E> subList(int fromIndex, int toIndex) {
            // TODO Auto-generated method stub
            return null;
        }
        
        private Node<E> eToNode(E e,boolean isFirst){
            Node<E> _node=firstNode;
            Node<E> needNode=null;
            for(int i=0;i<size;i++){
                if(_node.element==e){
                    if(isFirst)
                        return _node;
                    needNode=_node;
                }
    
                _node=_node.next;
            }
            return needNode;
        }
        
        private Node<E> indexToNode(int index){
            
            Node<E> _node=firstNode;
            for(int i=0;i<size;i++){
                if(i==index)
                    return _node;
                _node=_node.next;
            }
            return null;
        }
        
        private int eToIndex(E e,boolean isFirst){
            
            int needI=-1;
            Node<E> _Node=firstNode;
            
            for(int i=0;i<size;i++){
                if(_Node.element==e){
                    if(isFirst)
                        return i;
                    needI=i;
                }
            }
            return needI;
        }
    }
  • 相关阅读:
    Linux下date命令,格式化输出,时间设置
    Linux scp复制文件,不需要输入密码的技巧
    Linux中cp和scp命令的使用方法
    Linux定时任务系统 Cron
    Eclipse启动Tomcat后无法访问项目
    eclipse下tomcat插件配置说明
    RPM方式安装MySQL5.6和windows下安装mysql解压版
    shell script练习
    Eclipse Java注释模板设置详解
    mysql备份还原数据库
  • 原文地址:https://www.cnblogs.com/realsoul/p/5770964.html
Copyright © 2011-2022 走看看