日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构特性解析 (四)LinkedList

發(fā)布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构特性解析 (四)LinkedList 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

描述

LinkedList應(yīng)該也是開發(fā)中比較常用的數(shù)據(jù)結(jié)構(gòu)了,其基于鏈表數(shù)據(jù)結(jié)構(gòu)實現(xiàn),添加和刪除效率相對比較高,而隨機訪問效率偏低

特點

1.LinkedList是雙向不循環(huán)鏈表
通過查看鏈節(jié)點類:

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;}}

可以看到其有數(shù)據(jù),上一個節(jié)點和下一個節(jié)點,所以其是雙向的

而通過查看add源碼(add->linkLast)

void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}

我們可以看到next的節(jié)點為null,所以LinkedList是雙向不循環(huán)鏈表

2.添加和刪除的效率相對比較高
直接添加的函數(shù)在上面已經(jīng)看到了,其直接修改幾個節(jié)點地址即可做到添加操作
隨機添加的函數(shù)如下

public void add(int index, E element) {checkPositionIndex(index);if (index == size)linkLast(element);elselinkBefore(element, node(index));//node()為根據(jù)索引查找的函數(shù),稍后再看}void linkBefore(E e, Node<E> succ) {// assert succ != null;final Node<E> pred = succ.prev;final Node<E> newNode = new Node<>(pred, e, succ);succ.prev = newNode;if (pred == null)first = newNode;elsepred.next = newNode;size++;modCount++;}

可以看到,隨機添加只是查找到對應(yīng)索引的節(jié)點對象,然后通過修改地址指向來添加到指定位置的
刪除的代碼:

removeLast->unlinkLastprivate E unlinkLast(Node<E> l) {// assert l == last && l != null;final E element = l.item;final Node<E> prev = l.prev;l.item = null;l.prev = null; // help GClast = prev;if (prev == null)first = null;elseprev.next = null;size--;modCount++;return element;}

隨機刪除的代碼:(也只是修改地址指向而已)

E unlink(Node<E> x) {// assert x != null;final E 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;}

3.隨機訪問效率較低

public E get(int index) {checkElementIndex(index);return node(index).item;}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;}}

通過代碼可以發(fā)現(xiàn),每次通過索引來獲取數(shù)據(jù)都需要遍歷,如果當(dāng)前索引靠前就從first向后遍歷,否則從last向前遍歷,最壞的情況時間復(fù)雜度是n/2,所以如果用在RecyclerView.Adapter中就會出現(xiàn)查找的效率問題(頻繁遍歷)

4.存儲數(shù)據(jù)占用的內(nèi)存空間更多

private static class Node<E> {E item;Node<E> next;Node<E> prev;}

可以看到,每次保存數(shù)據(jù)都需要將數(shù)據(jù)包在Node(節(jié)點對象)中在保存起來,然后還會有兩個對象地址,這樣每保存一條數(shù)據(jù)都會多占用一個Node對象的內(nèi)存和兩個對象地址的內(nèi)存

5.forEach遍歷效率比fori效率更高
使用forEach的話是每次都獲取next的節(jié)點,而使用fori就是每次都相當(dāng)于隨機獲取,顯而易見的forEach效率更高

下一篇:數(shù)據(jù)結(jié)構(gòu)特性解析 (五)hash表

總結(jié)

以上是生活随笔為你收集整理的数据结构特性解析 (四)LinkedList的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。