6-1、java.util.LinkedList

6-1、java.util.LinkedList

package java.util ;
public class  LinkedList< E>
        extends AbstractSequentialList< E>
        implements List< E> Deque< E> Cloneable java.io.Serializable
{
    transient int  size 0 ;
    transient Node< Efirst ;
    transient Node< Elast ;
    public LinkedList() {
    }
    public LinkedList(Collection<?  extends  E> c) {
        this() ;
        addAll(c) ;
    }
    private void  linkFirst( e) {
        final Node< E> f =  first ;
        final Node< E> newNode =  new Node<>( null, e f) ;
        first = newNode ;
        if (f ==  null)
            last = newNode ;
        else
            f. prev = newNode ;
        size++ ;
        modCount++ ;
    }
    void  linkLast( e) {
        final Node< E> l =  last ;
        final Node< E> newNode =  new Node<>(l e , null) ;
        last = newNode ;
        if (l ==  null)
            first = newNode ;
        else
            l. next = newNode ;
        size++ ;
        modCount++ ;
    }
    void  linkBefore( e Node< E> succ) {
        final Node< E> pred = succ. prev ;
        final Node< E> newNode =  new Node<>(pred e succ) ;
        succ. prev = newNode ;
        if (pred ==  null)
            first = newNode ;
        else
            pred. next = newNode ;
        size++ ;
        modCount++ ;
    }
    private  unlinkFirst(Node< E> f) {
        final  element = f. item ;
        final Node< E> next = f. next ;
        f. item null;
        f. next null;  // help GC
        first = next ;
        if (next ==  null)
            last null;
        else
            next. prev null;
        size-- ;
        modCount++ ;
        return element ;
    }
    private  unlinkLast(Node< E> l) {
        final  element = l. item ;
        final Node< E> prev = l. prev ;
        l. item null;
        l. prev null;
        last = prev ;
        if (prev ==  null)
            first null;
        else
            prev. next null;
        size-- ;
        modCount++ ;
        return element ;
    }
    unlink(Node< E> x) {
        final  element = x. item ;
        final Node< E> next = x. next ;
        final Node< E> prev = x. prev ;
        if (prev ==  null) {
            first = next ;
       else {
            prev. next = next ;
            x. prev null;
        }
        if (next ==  null) {
            last = prev ;
       else {
            next. prev = prev ;
            x. next null;
        }
        x. item null;
        size-- ;
        modCount++ ;
        return element ;
    }
    public  getFirst() {
        final Node< E> f =  first ;
        if (f ==  null)
            throw new NoSuchElementException() ;
        return f. item ;
    }
    public  getLast() {
        final Node< E> l =  last ;
        if (l ==  null)
            throw new NoSuchElementException() ;
        return l. item ;
    }
    public  removeFirst() {
        final Node< E> f =  first ;
        if (f ==  null)
            throw new NoSuchElementException() ;
        return unlinkFirst(f) ;
    }
    public  removeLast() {
        final Node< E> l =  last ;
        if (l ==  null)
            throw new NoSuchElementException() ;
        return unlinkLast(l) ;
    }
    public void  addFirst( e) {linkFirst(e) ;}
    public void  addLast( e) {
        linkLast(e) ;
    }
    public boolean  contains(Object o) {
        return indexOf(o) != - 1 ;
    }
    public int  size() {
        return  size ;
    }
    public boolean  add( e) {
        linkLast(e) ;
        return true;
    }
    public boolean  remove(Object o) {
        if (o ==  null) {
            for (Node< E> x =  first x !=  null; x = x. next) {
                if (x. item ==  null) {
                    unlink(x) ;
                    return true;
                }
            }
        }  else {
            for (Node< E> x =  first x !=  null; x = x. next) {
                if (o.equals(x. item)) {
                    unlink(x) ;
                    return true;
                }
            }
        }
        return false;
    }
    public boolean  addAll(Collection<?  extends  E> c) {
        return addAll( size c) ;
    }
    public boolean  addAll( int index Collection<?  extends  E> c) {
        checkPositionIndex(index) ;
        Object[] a = c.toArray() ;
        int numNew = a. length ;
        if (numNew ==  0)
            return false;
        Node< E> pred succ ;
        if (index ==  size) {
            succ =  null;
            pred =  last ;
       else {
            succ = node(index) ;
            pred = succ. prev ;
        }

        for (Object o : a) {
            @SuppressWarnings( "unchecked"e = ( E) o ;
            Node< E> newNode =  new Node<>(pred e , null) ;
            if (pred ==  null)
                first = newNode ;
            else
                pred. next = newNode ;
            pred = newNode ;
        }

        if (succ ==  null) {
            last = pred ;
       else {
            pred. next = succ ;
            succ. prev = pred ;
        }

        size += numNew ;
        modCount++ ;
        return true;
    }
    public void  clear() {
        for (Node< E> x =  first x !=  null; ) {
            Node< E> next = x. next ;
            x. item null;
            x. next null;
            x. prev null;
            x = next ;
        }
        first last null;
        size 0 ;
        modCount++ ;
    }
    public  get( int index) {
        checkElementIndex(index) ;
        return node(index). item ;
    }
    public  set( int index element) {
        checkElementIndex(index) ;
        Node< E> x = node(index) ;
        oldVal = x. item ;
        x. item = element ;
        return oldVal ;
    }
    public void  add( int index element) {
        checkPositionIndex(index) ;
        if (index ==  size)
            linkLast(element) ;
        else
            linkBefore(element node(index)) ;
    }
    public  remove( int index) {
        checkElementIndex(index) ;
        return unlink(node(index)) ;
    }
    private boolean  isElementIndex( int index) {
        return index >=  && index <  size ;
    }
    private boolean  isPositionIndex( int index) {
        return index >=  && index <=  size ;
    }
    private String  outOfBoundsMsg( int index) {
        return  "Index: "+index+ ", Size: "+ size ;
    }
    private void  checkElementIndex( int index) {
        if (!isElementIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index)) ;
    }
    private void  checkPositionIndex( int index) {
        if (!isPositionIndex(index))
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index)) ;
    }
    Node< Enode( int index) {
        if (index < ( size >>  1)) {
            Node< E> x =  first ;
            for ( int i =  0 i < index i++)
                x = x. next ;
            return x ;
       else {
            Node< E> x =  last ;
            for ( int i =  size 1 i > index i--)
                x = x. prev ;
            return x ;
        }
    }
    public int  indexOf(Object o) {
        int index =  0 ;
        if (o ==  null) {
            for (Node< E> x =  first x !=  null; x = x. next) {
                if (x. item ==  null)
                    return index ;
                index++ ;
            }
        }  else {
            for (Node< E> x =  first x !=  null; x = x. next) {
                if (o.equals(x. item))
                    return index ;
                index++ ;
            }
        }
        return - 1 ;
    }
    public int  lastIndexOf(Object o) {
        int index =  size ;
        if (o ==  null) {
            for (Node< E> x =  last x !=  null; x = x. prev) {
                index-- ;
                if (x. item ==  null)
                    return index ;
            }
        }  else {
            for (Node< E> x =  last x !=  null; x = x. prev) {
                index-- ;
                if (o.equals(x. item))
                    return index ;
            }
        }
        return - 1 ;
    }
    public  peek() {
        final Node< E> f =  first ;
        return (f ==  null) ?  null : f. item ;
    }
    public  element() {
        return getFirst() ;
    }
    public  poll() {
        final Node< E> f =  first ;
        return (f ==  null) ?  null : unlinkFirst(f) ;
    }
    public  remove() {
        return removeFirst() ;
    }
    public boolean  offer( e) {
        return add(e) ;
    }
    public boolean  offerFirst( e) {
        addFirst(e) ;
        return true;
    }
    public boolean  offerLast( e) {
        addLast(e) ;
        return true;
    }
    public  peekFirst() {
        final Node< E> f =  first ;
        return (f ==  null) ?  null : f. item ;
    }
    public  peekLast() {
        final Node< E> l =  last ;
        return (l ==  null) ?  null : l. item ;
    }
    public  pollFirst() {
        final Node< E> f =  first ;
        return (f ==  null) ?  null : unlinkFirst(f) ;
    }
    public  pollLast() {
        final Node< E> l =  last ;
        return (l ==  null) ?  null : unlinkLast(l) ;
    }
    public void  push( e) {
        addFirst(e) ;
    }
    public  pop() {
        return removeFirst() ;
    }
    public boolean  removeFirstOccurrence(Object o) {
        return remove(o) ;
    }
    public boolean  removeLastOccurrence(Object o) {
        if (o ==  null) {
            for (Node< E> x =  last x !=  null; x = x. prev) {
                if (x. item ==  null) {
                    unlink(x) ;
                    return true;
                }
            }
        }  else {
            for (Node< E> x =  last x !=  null; x = x. prev) {
                if (o.equals(x. item)) {
                    unlink(x) ;
                    return true;
                }
            }
        }
        return false;
    }
    public ListIterator< ElistIterator( int index) {
        checkPositionIndex(index) ;
        return new ListItr(index) ;
    }
    private class ListItr  implements ListIterator< E> {
        private Node< ElastReturned null;
        private Node< Enext ;
        private int  nextIndex ;
        private int  expectedModCount modCount ;
        ListItr( int index) {
            next = (index ==  size) ?  null : node(index) ;
            nextIndex = index ;
        }
        public boolean  hasNext() {
            return  nextIndex size ;
        }
        public  next() {
            checkForComodification() ;
            if (!hasNext())
                throw new NoSuchElementException() ;
            lastReturned next ;
            next next. next ;
            nextIndex++ ;
            return  lastReturned. item ;
        }
        public boolean  hasPrevious() {
            return  nextIndex 0 ;
        }
        public  previous() {
            checkForComodification() ;
            if (!hasPrevious())
                throw new NoSuchElementException() ;
            lastReturned next = ( next ==  null) ?  last next. prev ;
            nextIndex-- ;
            return  lastReturned. item ;
        }
        public int  nextIndex() {
            return  nextIndex ;
        }
        public int  previousIndex() {
            return  nextIndex 1 ;
        }
        public void  remove() {
            checkForComodification() ;
            if ( lastReturned ==  null)
                throw new IllegalStateException() ;
            Node< E> lastNext =  lastReturned. next ;
            unlink( lastReturned) ;
            if ( next ==  lastReturned)
                next = lastNext ;
            else
                nextIndex-- ;
            lastReturned null;
            expectedModCount++ ;
        }
        public void  set( e) {
            if ( lastReturned ==  null)
                throw new IllegalStateException() ;
            checkForComodification() ;
            lastReturned. item = e ;
        }
        public void  add( e) {
            checkForComodification() ;
            lastReturned null;
            if ( next ==  null)
                linkLast(e) ;
            else
                linkBefore(e next) ;
            nextIndex++ ;
            expectedModCount++ ;
        }
        final void  checkForComodification() {
            if ( modCount !=  expectedModCount)
                throw new ConcurrentModificationException() ;
        }
    }
    private static class Node< E> {
        item ;
        Node< Enext ;
        Node< Eprev ;
        Node(Node< E> prev element Node< E> next) {
            this. item = element ;
            this. next = next ;
            this. prev = prev ;
        }
    }
    public Iterator< EdescendingIterator() {
        return new DescendingIterator() ;
    }
    private class DescendingIterator  implements Iterator< E> {
        private final ListItr  itr new ListItr(size()) ;
        public boolean  hasNext() {
            return  itr.hasPrevious() ;
        }
        public  next() {
            return  itr.previous() ;
        }
        public void  remove() {
            itr.remove() ;
        }
    }
    private  LinkedList< EsuperClone() {
        try {
            return ( LinkedList< E>)  super.clone() ;
       catch (CloneNotSupportedException e) {
            throw new InternalError() ;
        }
    }
    public Object  clone() {
        LinkedList< E> clone = superClone() ;
        clone. first = clone. last null;
        clone. size 0 ;
        clone. modCount 0 ;
        for (Node< E> x =  first x !=  null; x = x. next)
            clone.add(x. item) ;
        return clone ;
    }
    public Object[]  toArray() {
        Object[] result =  new Object[ size] ;
        int i =  0 ;
        for (Node< E> x =  first x !=  null; x = x. next)
            result[i++] = x. item ;
        return result ;
    }
    public < TT[]  toArray( T[] a) {
        if (a. length size)
            a = ( T[])java.lang.reflect.Array. newInstance(
                    a.getClass().getComponentType() size) ;
        int i =  0 ;
        Object[] result = a ;
        for (Node< E> x =  first x !=  null; x = x. next)
            result[i++] = x. item ;
        if (a. length size)
            a[ size] =  null;
        return a ;
    }
    private static final long  serialVersionUID 876323262645176354L ;
    private void  writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException {
        s.defaultWriteObject() ;
        s.writeInt( size) ;
        for (Node< E> x =  first x !=  null; x = x. next)
            s.writeObject(x. item) ;
    }
    private void  readObject(java.io.ObjectInputStream s)
            throws java.io.IOException ClassNotFoundException {
        s.defaultReadObject() ;
        int size = s.readInt() ;
        for ( int i =  0 i < size i++)
            linkLast(( E)s.readObject()) ;
    }
}

//说明:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值