b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

双向循环链表 深入理解ArrayList、Vector和LinkedLis(3)

电脑杂谈  发布时间:2018-02-17 07:04:58  来源:网络整理

是一个双链表,在add和remove时比ArrayList性能好,但get和set时就特别慢了。

恶补下:

双向链表,链表的一种。双向循环链表每个数据结点中都有两个指针,分别指向直接前驱和直接后继。因此,我们可以方便的访问他的前驱结点和后继结点。

下图是一个双向链表的图,element为元素,pre指向直接前驱(前一个 元素),next指向直接后继(后一个元素)。而LinkedList还不只是双向链表,他是双向循环链表。也就是第一个pre指针指向最后一个节点,最后一个节点的next指针指向第一个节点,形成一个环路,而不是下图中的Null。

这里写图片描述

下面来看下代码

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
    //元素个数
    transient int size = 0;
    //相当于pre指针
    transient Node<E> first;
    //相当于next指针
    transient Node<E> last;

    //Node内部类(双链表结构)
    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;
        }
    }
    ......
}

Tips:

Deque,他是双端队列的接口,支持在两端插入和移除元素。

双向循环链表_双向循环链表的创建_双向链表为空的条件

public interface Deque extends Queue {}

那么如何进行操作呢?这里以在中间位置添加元素为例。

这里写图片描述

代码实现如下


  //在指定位置添加元素
 public void add(int index, E element) {
        //检查索引是否有效
        checkPositionIndex(index);

        //索引值等于集合大小,直接添加在末尾
        if (index == size)
            linkLast(element);
        else
            linkBefore(element, node(index));
    }

    //返回索引处的非空Node
     Node<E> node(int index) {
        // assert isElementIndex(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;
        }
    }

    //中间插入元素(核心方法!!!!)
     void linkBefore(E 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++;
    }


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-81650-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...