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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LinkedList方法源码

發布時間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LinkedList方法源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在隊首隊尾添加元素方法

// 從隊列首添加元素 private void linkFirst(E e) {// 首節點final Node<E> f = first;// 創建新節點,新節點的next是首節點final Node<E> newNode = new Node<>(null, e, f);// 讓新節點作為新的首節點first = newNode;// 判斷是不是第一個添加的元素// 如果是就把last也置為新節點// 否則把原首節點的prev指針置為新節點if (f == null)last = newNode;elsef.prev = newNode;// 元素個數加1size++;// 修改次數加1,說明這是一個支持fail-fast的集合modCount++; }// 從隊列尾添加元素 void linkLast(E e) {// 隊列尾節點final Node<E> l = last;// 創建新節點,新節點的prev是尾節點final Node<E> newNode = new Node<>(l, e, null);// 讓新節點成為新的尾節點last = newNode;// 判斷是不是第一個添加的元素// 如果是就把first也置為新節點// 否則把原尾節點的next指針置為新節點if (l == null)first = newNode;elsel.next = newNode;// 元素個數加1size++;// 修改次數加1modCount++; }public void addFirst(E e) {linkFirst(e); }public void addLast(E e) {linkLast(e); }// 作為無界隊列,添加元素總是會成功的 public boolean offerFirst(E e) {addFirst(e);return true; }public boolean offerLast(E e) {addLast(e);return true; }

?在隊中添加元素

// 在節點succ之前添加元素 void linkBefore(E e, Node<E> succ) {// succ是待添加節點的后繼節點// 找到待添加節點的前置節點final Node<E> pred = succ.prev;// 在其前置節點和后繼節點之間創建一個新節點final Node<E> newNode = new Node<>(pred, e, succ);// 修改后繼節點的前置指針指向新節點succ.prev = newNode;// 判斷前置節點是否為空// 如果為空,說明是第一個添加的元素,修改first指針// 否則修改前置節點的next為新節點if (pred == null)first = newNode;elsepred.next = newNode;// 修改元素個數size++;// 修改次數加1modCount++; }// 尋找index位置的節點 Node<E> node(int index) {// 因為是雙鏈表// 所以根據index是在前半段還是后半段決定從前遍歷還是從后遍歷// 這樣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;} }// 在指定index位置處添加元素 public void add(int index, E element) {// 判斷是否越界checkPositionIndex(index);// 如果index是在隊列尾節點之后的一個位置// 把新節點直接添加到尾節點之后// 否則調用linkBefore()方法在中間添加節點if (index == size)linkLast(element);elselinkBefore(element, node(index)); }

刪除隊頭隊尾元素方法?

// 刪除首節點 private E unlinkFirst(Node<E> f) {// 首節點的元素值final E element = f.item;// 首節點的next指針final Node<E> next = f.next;// 添加首節點的內容,協助GCf.item = null;f.next = null; // help GC// 把首節點的next作為新的首節點first = next;// 如果只有一個元素,刪除了,把last也置為空// 否則把next的前置指針置為空if (next == null)last = null;elsenext.prev = null;// 元素個數減1size--;// 修改次數加1modCount++;// 返回刪除的元素return element; } // 刪除尾節點 private E unlinkLast(Node<E> l) {// 尾節點的元素值final E element = l.item;// 尾節點的前置指針final Node<E> prev = l.prev;// 清空尾節點的內容,協助GCl.item = null;l.prev = null; // help GC// 讓前置節點成為新的尾節點last = prev;// 如果只有一個元素,刪除了把first置為空// 否則把前置節點的next置為空if (prev == null)first = null;elseprev.next = null;// 元素個數減1size--;// 修改次數加1modCount++;// 返回刪除的元素return element; } // remove的時候如果沒有元素拋出異常 public E removeFirst() {final Node<E> f = first;if (f == null)throw new NoSuchElementException();return unlinkFirst(f); } // remove的時候如果沒有元素拋出異常 public E removeLast() {final Node<E> l = last;if (l == null)throw new NoSuchElementException();return unlinkLast(l); } // poll的時候如果沒有元素返回null public E pollFirst() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f); } // poll的時候如果沒有元素返回null public E pollLast() {final Node<E> l = last;return (l == null) ? null : unlinkLast(l); }

刪除隊中元素方法

// 刪除指定節點x E unlink(Node<E> x) {// x的元素值final E element = x.item;// x的前置節點final Node<E> next = x.next;// x的后置節點final Node<E> prev = x.prev;// 如果前置節點為空// 說明是首節點,讓first指向x的后置節點// 否則修改前置節點的next為x的后置節點if (prev == null) {first = next;} else {prev.next = next;x.prev = null;}// 如果后置節點為空// 說明是尾節點,讓last指向x的前置節點// 否則修改后置節點的prev為x的前置節點if (next == null) {last = prev;} else {next.prev = prev;x.next = null;}// 清空x的元素值,協助GCx.item = null;// 元素個數減1size--;// 修改次數加1modCount++;// 返回刪除的元素return element; } // 刪除中間節點 public E remove(int index) {// 檢查是否越界checkElementIndex(index);// 刪除指定index位置的節點return unlink(node(index)); }

?

總結

(1)LinkedList是一個以雙鏈表實現的List;

(2)LinkedList還是一個雙端隊列,具有隊列、雙端隊列、棧的特性;

(3)LinkedList在隊列首尾添加、刪除元素非常高效,時間復雜度為O(1);

(4)LinkedList在中間添加、刪除元素比較低效,時間復雜度為O(n);

(5)LinkedList不支持隨機訪問,所以訪問非隊列首尾的元素比較低效;

(6)LinkedList在功能上等于ArrayList + ArrayDeque;

總結

以上是生活随笔為你收集整理的LinkedList方法源码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。