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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LinkedList方法源码

發(fā)布時(shí)間:2024/2/28 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LinkedList方法源码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在隊(duì)首隊(duì)尾添加元素方法

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

?在隊(duì)中添加元素

// 在節(jié)點(diǎn)succ之前添加元素 void linkBefore(E e, Node<E> succ) {// succ是待添加節(jié)點(diǎn)的后繼節(jié)點(diǎn)// 找到待添加節(jié)點(diǎn)的前置節(jié)點(diǎn)final Node<E> pred = succ.prev;// 在其前置節(jié)點(diǎn)和后繼節(jié)點(diǎn)之間創(chuàng)建一個(gè)新節(jié)點(diǎn)final Node<E> newNode = new Node<>(pred, e, succ);// 修改后繼節(jié)點(diǎn)的前置指針指向新節(jié)點(diǎn)succ.prev = newNode;// 判斷前置節(jié)點(diǎn)是否為空// 如果為空,說明是第一個(gè)添加的元素,修改first指針// 否則修改前置節(jié)點(diǎn)的next為新節(jié)點(diǎn)if (pred == null)first = newNode;elsepred.next = newNode;// 修改元素個(gè)數(shù)size++;// 修改次數(shù)加1modCount++; }// 尋找index位置的節(jié)點(diǎn) Node<E> node(int index) {// 因?yàn)槭请p鏈表// 所以根據(jù)index是在前半段還是后半段決定從前遍歷還是從后遍歷// 這樣index在后半段的時(shí)候可以少遍歷一半的元素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是在隊(duì)列尾節(jié)點(diǎn)之后的一個(gè)位置// 把新節(jié)點(diǎn)直接添加到尾節(jié)點(diǎn)之后// 否則調(diào)用linkBefore()方法在中間添加節(jié)點(diǎn)if (index == size)linkLast(element);elselinkBefore(element, node(index)); }

刪除隊(duì)頭隊(duì)尾元素方法?

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

刪除隊(duì)中元素方法

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

?

總結(jié)

(1)LinkedList是一個(gè)以雙鏈表實(shí)現(xiàn)的List;

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

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

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

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

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

總結(jié)

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

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