java swing灰鸽子,java queue 使用 深入理解ArrayList、Vector和LinkedLis(3)

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

恶补下:

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

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

c226c98a911142b0e2b02a5aeda3d7cb.png

下面来看下代码

public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable{

//元素个数

transient int size = 0;

//相当于pre指针

transient Node first;

//相当于next指针

transient Node last;

//Node内部类(双链表结构)

private static class Node {

E item;

Node next;

Node prev;

Node(Node prev, E element, Node next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

......

}

Tips:

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

56cf2725c32bcfabfa30cd0946acb40a.jpg

public interface Deque extends Queue {}

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

3cd5f0dfd3e14016b1bb49dc95914c85.png

代码实现如下

//在指定位置添加元素

public void add(int index, E element) {

//检查索引是否有效

checkPositionIndex(index);

//索引值等于集合大小,直接添加在末尾

if (index == size)

linkLast(element);

else

linkBefore(element, node(index));

}

//返回索引处的非空Node

Node node(int index) {

// assert isElementIndex(index);

//如果在链表的前半段

if (index < (size >> 1)) {

Node x = first;

for (int i = 0; i < index; i++)

x = x.next;

return x;

} else {

//后半段

Node x = last;

for (int i = size - 1; i > index; i--)

x = x.prev;

return x;

}

}

//中间插入元素(核心方法!!!!)

void linkBefore(E e, Node succ) {

final Node pred = succ.prev;

final Node 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-82146-3.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值