码迷,mamicode.com
首页 > 其他好文 > 详细

MyLinkedList

时间:2016-08-14 22:10:45      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:

注:

  简单的测试了下,基本操作没什么问题。我是直接实现了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;
    }
}

 

MyLinkedList

标签:

原文地址:http://www.cnblogs.com/realsoul/p/5770964.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!