Android LinkedList

LinkedList實(shí)現(xiàn)

Android的LinkedList是通過雙向列表實(shí)現(xiàn)的。鏈表元素除了含有自身的值以為,還含有上一個(gè)元素和下一個(gè)元素的引用。

    private static final class Link<ET> {
        ET data;//當(dāng)前值

        Link<ET> previous, next;//上一個(gè),和下個(gè)鏈表對(duì)象的引用

        Link(ET o, Link<ET> p, Link<ET> n) {
            data = o;
            previous = p;
            next = n;
        }
    }

普通添加方法

真正是由該方法實(shí)現(xiàn),新元素添加在鏈表的最后,addLast同樣是這個(gè)方法實(shí)現(xiàn)
將上一個(gè)元素的head節(jié)點(diǎn)指向新元素

 private boolean addLastImpl(E object) {
        Link<E> oldLast = voidLink.previous;
      //新元素的頭指向上一個(gè)元素,尾指向鏈表的頭部
        Link<E> newLink = new Link<E>(object, oldLast, voidLink);
      //頭元素的頭指向新元素
        voidLink.previous = newLink;
       //上一個(gè)結(jié)尾元素的尾 指向新元素
        oldLast.next = newLink;
        size++;
        modCount++;
        return true;
    }

2.在指定位置插入
1.插入的位置要下于link鏈表的長(zhǎng)度
2.向前后移動(dòng)元數(shù)據(jù),空出當(dāng)前位置給新元素,上一個(gè)元素的next和下一個(gè)元素的head分別指向這個(gè)元素。

  public void add(int location, E object) {
        if (location >= 0 && location <= size) {
            Link<E> link = voidLink;
            if (location < (size / 2)) {
                for (int i = 0; i <= location; i++) {
                    link = link.next;
                }
            } else {
                for (int i = size; i > location; i--) {
                    link = link.previous;
                }
            }
            Link<E> previous = link.previous;
            Link<E> newLink = new Link<E>(object, previous, link);
            previous.next = newLink;
            link.previous = newLink;
            size++;
            modCount++;
        } else {
            throw new IndexOutOfBoundsException();
        }
    }

查詢

從頭開始遍歷鏈表元素的每一個(gè)元素。

 public boolean contains(Object object) {
        Link<E> link = voidLink.next;
        if (object != null) {
            while (link != voidLink) {
                if (object.equals(link.data)) {
                    return true;
                }
                link = link.next;
            }
        } else {
            while (link != voidLink) {
                if (link.data == null) {
                    return true;
                }
                link = link.next;
            }
        }
        return false;
    }

刪除

同樣會(huì)遍歷元素 找到對(duì)應(yīng)位置上前后的元素,將之前該位置前后的連個(gè)元素鏈接首位鏈接起來。

    @Override
    public E remove(int location) {
        if (location >= 0 && location < size) {
            Link<E> link = voidLink;
            if (location < (size / 2)) {
                for (int i = 0; i <= location; i++) {
                    link = link.next;
                }
            } else {
                for (int i = size; i > location; i--) {
                    link = link.previous;
                }
            }
            Link<E> previous = link.previous;
            Link<E> next = link.next;
            previous.next = next;
            next.previous = previous;
            size--;
            modCount++;
            return link.data;
        }
        throw new IndexOutOfBoundsException();
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一.線性表 定義:零個(gè)或者多個(gè)元素的有限序列。也就是說它得滿足以下幾個(gè)條件:??①該序列的數(shù)據(jù)元素是有限的。??②...
    Geeks_Liu閱讀 2,714評(píng)論 1 12
  • 前言 今天來介紹下LinkedList,在集合框架整體框架一章中,我們介紹了List接口,LinkedList與A...
    嘟爺MD閱讀 3,636評(píng)論 11 37
  • 前言 在前一篇文章我以面試問答的形式與大家一同學(xué)習(xí)了ArrayList,有興趣但是沒閱讀過的同學(xué)可以翻看我的文章記...
    liangzzz閱讀 1,196評(píng)論 0 8
  • LinkedList是基于鏈表實(shí)現(xiàn)的,它的數(shù)據(jù)結(jié)構(gòu)可以表示為下圖 這里的data每個(gè)都是一個(gè)Link對(duì)象,它的結(jié)構(gòu)...
    逍遙天_lpc閱讀 1,042評(píng)論 0 0
  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,535評(píng)論 0 6