Collection容器家族(读完LinkedList源码---小测试:自定义具有LinkedList各项功能的实现类)

        前面的几篇文章对LinkedList的超类和本身以及接口进行了讲解,为了更加深入理解LinkedList集合使用存储数据的思想,特意实现了一个自定义的MyLinkedList,源码如下:(如有错误,还望多多指教

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Spliterator;
import java.util.function.Consumer;

/**
 * 看完LinkedList源码,自己实现具有增删改查功能的基于双向链表数据结构的集合
 */
public class MyLinkedList <E> implements Iterable<E> {
    transient int size;     // 链表中元素的个数
    transient Node<E> first;    // 头结点
    transient Node<E> last;     // 尾节点

    // 这里仅提供了无参构造
    public MyLinkedList() {}

    // 增
    public boolean add(E e) {
        linkLast(e);
        return true;
    }

    // 在结尾处添加元素
    private void linkLast(E e) {
        Node<E> l = last;
        Node<E> newNode = new Node<>(l, e, null);
        last = newNode;

        if (l == null) {
            first = newNode;
        } else {
            l.next = newNode;
        }

        size++;
    }

    public boolean add(int index, E e) {
        if (index == size) {
            linkLast(e);
        } else {
            linkBefore(e, node(index));
        }

        return true;
    }

    private void linkBefore(E e, Node<E> node) {
        Node<E> pred = node.prev;
        Node<E> newNode = new Node<>(pred, e, node);
        node.prev = newNode;
        if (pred == null) {
            first = newNode;
        } else {
            pred.next = newNode;
        }

        size++;
    }

    // 删
    public E remove(int index) {
        Node<E> oldNode = node(index);
        E element = oldNode.item;
        Node<E> pred = oldNode.prev;
        Node<E> succ = oldNode.next;

        oldNode.prev = oldNode.next = null;

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

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

        size--;
        oldNode.item = null;

        return element;
    }

    public void clear() {
        for (Node<E> x = first; x != null; ) {
            Node<E> next = x.next;
            x.prev = null;
            x.item = null;
            x.next = null;
            x = next;
        }

        first = last = null;
        size = 0;
    }

    // 改
    public E set(int index, E e) {
        Node<E> node = node(index);
        E item = node.item;
        node.item = e;
        return item;
    }

    // 查
    public E get(int index) {
        return node(index).item;
    }

    private Node<E> node(int index) {
        if (index < (size >> 1)) {
            Node<E> next = first;
            for (int i = 0; i < index; i++)
                next = next.next;
            return next;
        } else {
            Node<E> prev = last;
            for (int i = size - 1; i > index; i--)
                prev = prev.prev;
            return prev;
        }
    }

    // 返回迭代器
    public Iterator<E> iterator(int index) {
        return new Itr(index);
    }

    @Override
    public Iterator<E> iterator() {
        return new Itr(0);
    }
    
    /**
     * 这里仅提供正向遍历迭代器,反向的和并行迭代器不提供了
     */
    private class Itr implements Iterator<E> {
        private Node<E> lastReturned;
        private Node<E> next;
        private int nextIndex;

        public Itr(int index) {
            next = (index == size) ? null : node(index);
            nextIndex = index;
        }

        @Override
        public boolean hasNext() {
            return nextIndex < size;
        }

        @Override
        public E next() {
            if (!hasNext())
                throw new NoSuchElementException();

            lastReturned = next;
            next = next.next;
            nextIndex++;

            return lastReturned.item;
        }
    }

    /**
     * 链表节点数据结构类
     */
    private static class Node<E> {
        E item;
        Node<E> prev;
        Node<E> next;

        public Node(Node<E> prev, E item, Node<E> next) {
            this.item = item;
            this.prev = prev;
            this.next = next;
        }
    }
}

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值