精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

LinkedList 源碼分析,你想知道的都在這里

開發 后端
LinkedList是一種可以在任何位置進行高效地插入和移除操作的有序序列,它是基于雙向鏈表實現的,是線程不安全的,允許元素為null的雙向鏈表。

概述

LinkedList是一種可以在任何位置進行高效地插入和移除操作的有序序列,它是基于雙向鏈表實現的,是線程不安全的,允許元素為null的雙向鏈表。

源碼分析

變量

/**
 * 集合元素數量
 **/
transient int size = 0;

/**
 * 指向第一個節點的指針
 * Invariant: (first == null && last == null) ||
 *            (first.prev == null && first.item != null)
 */
transient Node<E> first;

/**
 * 指向最后一個節點的指針
 * Invariant: (first == null && last == null) ||
 *            (last.next == null && last.item != null)
 */
transient Node<E> last;

構造方法

/**
 * 無參構造方法
 */
public LinkedList() {
}

/**
 * 將集合c所有元素插入鏈表中
 */
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}

Node節點

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

因為一個Node既有prev也有next,所以證明它是一個雙向鏈表。

添加元素

addAll(Collection c)

將集合c添加到鏈表,如果不傳index,則默認是添加到尾部。如果調用addAll(int index, Collection c)方法,則添加到index后面。

/**
 * 將集合添加到鏈尾
 */
public boolean addAll(Collection<? extends E> c) {
    return addAll(size, c);
}

/** 
 * 
 */
public boolean addAll(int index, Collection<? extends E> c) {
    checkPositionIndex(index);

    // 拿到目標集合數組
    Object[] a = c.toArray();
    //新增元素的數量
    int numNew = a.length;
    //如果新增元素數量為0,則不增加,并返回false
    if (numNew == 0)
        return false;
    
    //定義index節點的前置節點,后置節點
    Node<E> pred, succ;
    // 判斷是否是鏈表尾部,如果是:在鏈表尾部追加數據
    //尾部的后置節點一定是null,前置節點是隊尾
    if (index == size) {
        succ = null;
        pred = last;
    } else {
        // 如果不在鏈表末端(而在中間部位)
        // 取出index節點,并作為后繼節點
        succ = node(index);
        // index節點的前節點 作為前驅節點
        pred = succ.prev;
    }

    // 鏈表批量增加,是靠for循環遍歷原數組,依次執行插入節點操作
    for (Object o : a) {
        @SuppressWarnings("unchecked") 
        // 類型轉換
        E e = (E) o;
        // 前置節點為pred,后置節點為null,當前節點值為e的節點newNode
        Node<E> newNode = new Node<>(pred, e, null);
        // 如果前置節點為空, 則newNode為頭節點,否則為pred的next節點
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        pred = newNode;
    }

    // 循環結束后,如果后置節點是null,說明此時是在隊尾追加的
    if (succ == null) {
        // 設置尾節點
        last = pred;
    } else {
    //否則是在隊中插入的節點 ,更新前置節點 后置節點
        pred.next = succ;
        succ.prev = pred;
    }

    // 修改數量size
    size += numNew;
    //修改modCount
    modCount++;
    return true;
}
/**
  * 取出index節點
  */ 
Node<E> node(int index) {
    // assert isElementIndex(index);

    // 如果index 小于 size/2,則從頭部開始找
    if (index < (size >> 1)) {
        // 把頭節點賦值給x
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            // x=x的下一個節點
            x = x.next;
        return x;
    } else {
        // 如果index 大與等于 size/2,則從后面開始找
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}
// 檢測index位置是否合法
private void checkPositionIndex(int index) {
    if (!isPositionIndex(index))
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// 檢測index位置是否合法
private boolean isPositionIndex(int index) {
    return index >= 0 && index <= size;
}    

假設我們要在index=2處添加{1,2}到鏈表中,圖解如下:

第一步:拿到index=2的前驅節點 prev=ele1。

第二步:遍歷集合prev.next=newNode,并實時更新prev節點以便下一次。
遍歷:prev=newNode

第三步:將index=2的節點ele2接上:prev.next=ele2,ele2.prev=prev。

注意node(index)方法:尋找處于index的節點,有一個小優化,結點在前半段則從頭開始遍歷,在后半段則從尾開始遍歷,這樣就保證了只需要遍歷最多一半結點就可以找到指定索引的結點。

addFirst(E e)方法

將e元素添加到鏈表并設置其為頭節點(first)。

public void addFirst(E e) {
    linkFirst(e);
}

//將e鏈接成列表的第一個元素
private void linkFirst(E e) {

    final Node<E> f = first;
    // 前驅為空,值為e,后繼為f
    final Node<E> newNode = new Node<>(null, e, f);
    first = newNode;
    //若f為空,則表明列表中還沒有元素,last也應該指向newNode
    if (f == null)
        last = newNode;
    else
    //否則,前first的前驅指向newNode
        f.prev = newNode;
    size++;
    modCount++;
}
  • 拿到first節點命名為f。
  • 新創建一個節點newNode設置其next節點為f節點。
  • 將newNode賦值給first。
  • 若f為空,則表明列表中還沒有元素,last也應該指向newNode;否則,前first的前驅指向newNode。

addLast(E e)方法

將e元素添加到鏈表并設置其為尾節點(last)。

public void addLast(E e) {
    linkLast(e);
}
/**
 * 將e鏈接成列表的last元素
 */
void linkLast(E e) {
    final Node<E> l = last;
    // 前驅為前last,值為e,后繼為null
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    //最后一個節點為空,說明列表中無元素
    if (l == null)
        //first同樣指向此節點
        first = newNode;
    else
        //否則,前last的后繼指向當前節點
        l.next = newNode;
    size++;
    modCount++;
}

過程與linkFirst()方法類似,這里略過。

add(E e)方法

在尾部追加元素e。

public boolean add(E e) {
    linkLast(e);
    return true;
}

void linkLast(E e) {
    final Node<E> l = last;
    // 前驅為前last,值為e,后繼為null
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    //最后一個節點為空,說明列表中無元素
    if (l == null)
        //first同樣指向此節點
        first = newNode;
    else
        //否則,前last的后繼指向當前節點
        l.next = newNode;
    size++;
    modCount++;
}

add(int index, E element)方法

在鏈表的index處添加元素element.

public void add(int index, E element) {
    checkPositionIndex(index);

    if (index == size)
        linkLast(element);
    else
        linkBefore(element, node(index));
}
/**
 * 在succ節點前增加元素e(succ不能為空)
 */
void linkBefore(E e, Node<E> succ) {
    // assert succ != null;
    // 拿到succ的前驅
    final Node<E> pred = succ.prev;
    // 新new節點:前驅為pred,值為e,后繼為succ
    final Node<E> newNode = new Node<>(pred, e, succ);
    // 將succ的前驅指向當前節點
    succ.prev = newNode;
    // pred為空,說明此時succ為首節點
    if (pred == null)
        // 指向當前節點
        first = newNode;
    else
        // 否則,將succ之前的前驅的后繼指向當前節點
        pred.next = newNode;
    size++;
    modCount++;
}

linkLast方法上文有講。
linkBefore(E e, Node<E> succ)方法步驟:

  • 拿到succ的前驅節點。
  • 新new節點:前驅為pred,值為e,后繼為succ : Node<>(pred, e, succ)。
  • 將succ的前驅指向當前節點。
  • pred為空,說明此時succ為首節點,first指向當前節點;否則,將succ之前的前驅的后繼指向當前節點。

5、獲取/查詢元素

get(int index)方法

根據索引獲取鏈表中的元素。

public E get(int index) {
    checkElementIndex(index);
    return node(index).item;
}

// 檢測index合法性
private void checkElementIndex(int index) {
    if (!isElementIndex(index))
        throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

// 根據index 獲取元素
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;
    }
}

node方法上文有詳細講解,這里不做介紹。

getFirst()方法

獲取頭節點。

public E getFirst() {
    final Node<E> f = first;
    if (f == null)
        throw new NoSuchElementException();
    return f.item;
}

getLast()方法

獲取尾節點。

public E getLast() {
    final Node<E> l = last;
    if (l == null)
        throw new NoSuchElementException();
    return l.item;
}

6、刪除元素

remove(Object o)

根據Object對象刪除元素。

public boolean remove(Object o) {
    // 如果o是空
    if (o == null) {
        // 遍歷鏈表查找 item==null 并執行unlink(x)方法刪除
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {
                unlink(x);
                return true;
            }
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}

E unlink(Node<E> x) {
    // assert x != null;
    // 保存x的元素值
    final E element = x.item;
    //保存x的后繼
    final Node<E> next = x.next;
    //保存x的前驅
    final Node<E> prev = x.prev;

    //如果前驅為null,說明x為首節點,first指向x的后繼
    if (prev == null) {
        first = next;
    } else {
        //x的前驅的后繼指向x的后繼,即略過了x
        prev.next = next;
        // x.prev已無用處,置空引用
        x.prev = null;
    }

    // 后繼為null,說明x為尾節點
    if (next == null) {
        // last指向x的前驅
        last = prev;
    } else {
        // x的后繼的前驅指向x的前驅,即略過了x
        next.prev = prev;
        // x.next已無用處,置空引用
        x.next = null;
    }
    // 引用置空
    x.item = null;
    size--;
    modCount++;
    // 返回所刪除的節點的元素值
    return element;
}
  • 遍歷鏈表查找 item==null 并執行unlink(x)方法刪除。
  • 如果前驅為null,說明x為首節點,first指向x的后繼,x的前驅的后繼指向x的后繼,即略過了x。
  • 如果后繼為null,說明x為尾節點,last指向x的前驅;否則x的后繼的前驅指向x的前驅,即略過了x,置空x.next。
  • 引用置空:x.item = null。
  • 圖解。

remove(int index)方法

根據鏈表的索引刪除元素。

public E remove(int index) {
    checkElementIndex(index);
    //node(index)會返回index對應的元素
    return unlink(node(index));
}

E unlink(Node<E> x)  方法上文有詳解。

removeFirst()方法

刪除頭節點。

public E removeFirst() {
    final Node<E> f = first;
    if (f == null)
        throw new NoSuchElementException();
    return unlinkFirst(f);
}

private E unlinkFirst(Node<E> f) {
    // assert f == first && f != null;
    //取出首節點中的元素
    final E element = f.item;
    //取出首節點中的后繼
    final Node<E> next = f.next;
    f.item = null;
    f.next = null; // help GC
    // first指向前first的后繼,也就是列表中的2號位
    first = next;
    //如果此時2號位為空,那么列表中此時已無節點
    if (next == null)
        //last指向null
        last = null;
    else
        // 首節點無前驅 
        next.prev = null;
    size--;
    modCount++;
    return element;
}

原理與添加頭節點類似。

removeLast()方法

刪除尾節點(last)

public E removeLast() {
    final Node<E> l = last;
    if (l == null)
        throw new NoSuchElementException();
    return unlinkLast(l);
}

private 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 GC
    // last指向前last的前驅,也就是列表中的倒數2號位
    last = prev;
    // 如果此時倒數2號位為空,那么列表中已無節點
    if (prev == null)
        // first指向null
        first = null;
    else
        // 尾節點無后繼
        prev.next = null;
    size--;
    modCount++;
    // 返回尾節點保存的元素值
    return element;
}

7、修改元素

修改元素比較簡單,先找到index對應節點,然后對值進行修改。

public E set(int index, E element) {
    checkElementIndex(index);
    // 獲取到需要修改元素的節點
    Node<E> x = node(index);
    // 保存之前的值
    E oldVal = x.item;
    // 執行修改
    x.item = element;
    // 返回舊值
    return oldVal;
}

8、與ArrayList的對比

優點:

  • 不需要擴容和預留空間,空間效率高。
  • 增刪效率高。

缺點:

  • 隨機訪問時間效率低。
  • 改查效率低。
責任編輯:姜華 來源: 今日頭條
相關推薦

2021-06-17 13:40:47

區塊鏈比特幣公有鏈

2019-11-04 09:07:48

DevOps互聯網IT

2019-04-24 08:31:43

分布式限流kafka

2020-03-18 18:20:19

區塊鏈數字貨幣比特幣

2018-11-28 10:39:01

5G網絡運營商

2017-08-15 15:35:21

大數據數據分析薪資秘密

2017-08-15 16:05:18

大數據數據分析薪資秘密

2018-03-31 08:45:52

iPhone交通卡iOS 11.3

2019-04-26 09:38:36

中臺平臺化轉型

2021-07-01 09:00:00

安全數字化轉型滲透

2022-11-08 15:55:34

鴻蒙開發套件

2017-01-11 08:37:07

Apache SparStreamingDataFrames

2021-07-02 14:09:36

開發技能代碼

2017-12-13 14:24:08

Google 開發者瀏覽器

2015-10-12 15:50:40

2018-05-10 08:50:31

AndroidGoogle 移動系統

2021-02-23 09:28:48

大數據數據分析

2019-10-29 15:28:40

Refs組件前端

2018-08-23 11:58:53

區塊鏈數字貨幣比特幣

2022-09-15 14:22:19

協作規范前后端
點贊
收藏

51CTO技術棧公眾號

中文文字幕一区二区三三| 欧美黑人欧美精品刺激| 人妖欧美1区| 91在线精品一区二区三区| 日本免费久久高清视频| 亚洲色图欧美色| 日韩视频一区二区三区四区| 婷婷综合在线观看| 亚洲黄色一区二区三区| 亚洲av无码片一区二区三区 | 国产精品久久久久久久久久久久久久久| 亚洲精品国产一区二区精华液 | 日韩美女一区二区三区在线观看| 日韩欧美在线影院| 久久久精品麻豆| 人妖欧美1区| 亚洲国产成人私人影院tom| 99视频国产精品免费观看| 婷婷激情五月综合| 亚洲久久视频| 欧美乱人伦中文字幕在线| www.狠狠爱| 精品国产乱子伦一区二区| 欧美三级日韩在线| avav在线看| 欧美性受ⅹ╳╳╳黑人a性爽| 国产精品久久三区| 久久精品一二三区| 欧美一级淫片aaaaaa| 国产在线日韩欧美| 国产精自产拍久久久久久| 久久国产黄色片| 一区视频在线| 欧美高清视频在线| 日韩a级片在线观看| 成人影院天天5g天天爽无毒影院| 国产婷婷成人久久av免费高清| 国产成人精品一区二区三区在线观看 | 亚洲AV无码国产精品午夜字幕 | 亚洲香蕉网站| 久久视频免费在线播放| 国产精品成人在线视频| 精品日韩欧美一区| 亚洲欧洲自拍偷拍| 亚洲AV无码国产成人久久| 人人网欧美视频| 亚洲精品456在线播放狼人| 佐佐木明希电影| 日本免费精品| 日韩三级电影网址| 欧美一区二区三区影院| 亚洲国产精品免费视频| 欧美成人性战久久| 特黄特色免费视频| www.爱久久| 亚洲成色www8888| 日韩aaaaa| 亚洲人成亚洲精品| 国产亚洲福利一区| 日韩一区二区三区四区视频| 色777狠狠狠综合伊人| 神马久久桃色视频| 国产午夜手机精彩视频| 欧美在线精品一区| 久久久中精品2020中文| 精品成人久久久| 免费欧美在线| 国产精品亚洲第一区| 国产伦精品一区二区三区四区| 精品一区二区免费| 91丨九色丨国产| 亚洲AV成人无码一二三区在线| 久久这里只有精品视频网| 日本精品二区| h片在线免费观看| 一区二区三区加勒比av| 国产极品在线视频| 日本在线中文字幕一区二区三区| 欧美日本乱大交xxxxx| 日本一区二区三区在线免费观看| 国产福利资源一区| 亚洲色图第三页| 一区二区三区影视| 国产欧美激情| 成人a在线视频| 后入内射欧美99二区视频 | 九九精品视频免费| 夜夜精品视频| 国产综合香蕉五月婷在线| 欧美 日韩 国产 成人 在线| 久久久精品国产免大香伊| 宅男噜噜99国产精品观看免费| 亚洲丝袜一区| 一本大道久久a久久综合| 日本在线播放一区二区| 开心激情综合| 久久精品国产成人精品| 日韩成人免费在线观看| 久久电影国产免费久久电影 | 天天干天天舔天天射| 国产精品成人免费| www.玖玖玖| 只有精品亚洲| 亚洲人a成www在线影院| 欧美偷拍第一页| 秋霞国产午夜精品免费视频| 精品无人乱码一区二区三区的优势 | 国产极品尤物在线| 亚洲美女色播| 亚洲美女性生活视频| 激情五月少妇a| 久久精品国产免费| 欧美激情第一页在线观看| 在线h片观看| 欧美日韩一区二区三区高清| 添女人荫蒂视频| 欧美a级一区| 国产精品视频地址| 免费a在线观看| 精品久久久国产| www.四虎精品| 91成人网在线观看| 国产精品国语对白| 青青免费在线视频| 午夜伊人狠狠久久| 成年人网站av| 国产精品久久久久无码av| 国产精品999999| 激情小视频在线| 欧美日韩激情视频| 国产伦精品一区二区免费| 欧美黄色aaaa| 不卡日韩av| 日本三级韩国三级欧美三级| 日韩亚洲欧美在线| 亚洲第一视频区| 日韩成人dvd| 欧美日韩国产综合视频在线| 国产拍在线视频| 精品剧情v国产在线观看在线| 午夜精品一区二区三区视频| 国产一区二区三区四| 中文字幕在线中文字幕日亚韩一区 | 国产精品最新在线观看| 色综合久久久久综合一本到桃花网| 91久久免费观看| 免费看黄色av| 奇米亚洲午夜久久精品| 亚洲人成77777| 性欧美video另类hd尤物| 日韩专区在线观看| 国产日韩欧美一区二区东京热| 最新国产精品久久精品| 日本中文字幕在线不卡| 欧美精品一线| 激情五月综合色婷婷一区二区| 77thz桃花论族在线观看| 亚洲高清久久网| 人人草在线观看| 中文字幕av一区二区三区高 | 久久中文字幕视频| 国产三级小视频| 亚洲一区二区精品3399| 久久久国产精品无码| 午夜亚洲精品| 亚洲欧美国产精品桃花| 欧美一区一区| 97国产精品免费视频| 九一国产在线| 欧美日韩国产综合一区二区三区| 婷婷久久综合网| 成人黄色网址在线观看| 久久精品网站视频| 国产韩国精品一区二区三区| 国产高清自拍99| 日韩精选视频| 欧美日韩第一页| 激情小视频在线观看| 在线成人免费观看| 日本中文字幕网| 亚洲国产精品二十页| 亚洲第一区第二区第三区| 亚洲国产mv| 天天好比中文综合网| 亚洲一区二区免费在线观看| 国内精品在线一区| 亚洲乱亚洲乱妇| 亚洲国产精品电影在线观看| 天天干天天插天天射| 亚洲乱码中文字幕| 永久免费成人代码| 国产一区二区女| 成年人在线看片| 欧美有码视频| 亚洲精品tv久久久久久久久| 第四色在线一区二区| 国产精品一区二区性色av| а_天堂中文在线| 久久九九国产精品怡红院| 污视频在线免费观看| 51精品久久久久久久蜜臀| 性无码专区无码| 亚洲韩国精品一区| 91狠狠综合久久久| 久久久国际精品| a级片在线观看视频| 久久99久久精品| 日韩手机在线观看视频| 尹人成人综合网| 中文字幕久久综合| 欧美色女视频| 久久久久久久久久久一区 | 日韩高清av| 免费成人三级| 国产日韩精品久久| 国产麻豆一区二区三区| 国产精品专区第二| 激情亚洲影院在线观看| 国产91精品青草社区| 美女尤物在线视频| 久久亚洲国产精品| 欧美性天天影视| 国产亚洲欧洲黄色| 精品资源在线看| 精品一区电影国产| 午夜性色福利视频| 亚洲精品一区二区三区蜜桃下载| 国产偷拍一区二区| 在线不卡a资源高清| 波多野结衣mp4| 色狠狠桃花综合| 日韩欧美三级视频| 精品国产91久久久久久老师| 精品无码m3u8在线观看| 亚洲最新视频在线播放| 免看一级a毛片一片成人不卡| 中文字幕一区在线| 男人晚上看的视频| 1000精品久久久久久久久| 色婷婷粉嫩av| 亚洲日本一区二区三区| 久久成人小视频| 亚洲三级免费电影| 三级全黄做爰视频| 洋洋成人永久网站入口| 欧美黄色免费看| 亚洲综合色网站| 国产五月天婷婷| 午夜精品久久久| 国产区在线观看视频| 岛国视频午夜一区免费在线观看| 韩国av中文字幕| 日本道在线观看一区二区| 最近中文字幕在线观看| 欧美色倩网站大全免费| 国产精品毛片一区视频播| 欧美一区二区三区免费在线看| 亚洲av综合色区无码一二三区| 日韩欧美综合在线| 日本毛片在线观看| 亚洲欧美制服第一页| 91在线品视觉盛宴免费| 国产人妻互换一区二区| 国产视频精品久久| 亚洲视频在线观看免费| 8888四色奇米在线观看| 久久成人精品视频| av免费不卡| 国产精品成人一区二区| 色综合久久久| 粉嫩av一区二区三区免费观看| 国产+成+人+亚洲欧洲在线| 久久精品一二三区| 欧美激情国产在线| 成人午夜免费在线视频| 欧美亚洲三级| www.久久久久久久久久久| 国产91精品免费| 波多野结衣片子| 亚洲日本在线a| 麻豆久久久久久久久久| 欧美日韩一区二区三区免费看| 精品人妻一区二区三区含羞草| 亚洲精品国产精品国自产观看浪潮| 国产最新视频在线观看| 久久伊人精品天天| 香蕉久久免费电影| 91传媒视频在线观看| 欧美日韩一区二区三区四区不卡 | 日本欧美肥老太交大片| 亚洲天堂第一区| 久久精品动漫| 91超薄肉色丝袜交足高跟凉鞋| 国产亚洲污的网站| 久久这里只有精品免费| 欧美性高清videossexo| 免费看黄色一级视频| www亚洲欧美| 中文不卡1区2区3区| 97se亚洲综合| 99久久精品费精品国产风间由美| 日本在线xxx| 国产精品一区二区在线播放| 中文字幕第4页| 午夜激情久久久| 国产露脸国语对白在线| 亚洲无线码在线一区观看| 国产激情视频在线看| 亚洲一区久久久| 久久高清精品| 人人爽人人av| 99久久er热在这里只有精品66| 91porn在线视频| 欧美日韩国产片| 国产综合视频一区二区三区免费| 国内精品久久久久久影视8| 国产精品一区二区三区四区在线观看| 欧洲av一区| 亚洲影院一区| 污污内射在线观看一区二区少妇 | 国产亚洲精品精华液| 毛片aaaaa| 91精品国产色综合久久不卡蜜臀 | 国产精品入口免费视频一| 久久夜色电影| 夜夜添无码一区二区三区| 国产一区二区女| 永久看片925tv| 91精品免费观看| 欧美高清视频| 国产主播在线一区| 欧美成人milf| 一本色道久久亚洲综合精品蜜桃| 久久久久国产精品厨房| 青草视频在线观看免费| 国产丝袜一区视频在线观看 | 一区二区三区视频在线观看视频| 日本高清不卡在线| 九九热线有精品视频99| 中文字幕无码不卡免费视频| 国产亚洲综合性久久久影院| 99久久久久久久久| 亚洲图片欧美午夜| 在线看欧美视频| 亚洲精品在线免费| 久久99精品久久久久久国产越南| 午夜激情福利电影| 欧美二区乱c少妇| 国产欧美久久久久久久久| 91久久精品一区| 欧美激情五月| 国产女人18毛片水真多18| 五月天欧美精品| 欧美一区二区视频| 国产精品久久久久秋霞鲁丝 | 秋霞蜜臀av久久电影网免费| 777久久久精品一区二区三区| 久久久不卡网国产精品一区| 无码人妻av免费一区二区三区| 一区二区三欧美| 亚洲视频资源| 亚洲精品无码国产| 久久精品在这里| 亚洲一级av毛片| 九九热最新视频//这里只有精品| 精品国产导航| 日本激情视频在线| 亚洲欧美日韩久久精品| 蜜臀av中文字幕| 国产成人精品国内自产拍免费看| 色999国产精品| 国产亚洲精品成人a| 色婷婷激情综合| 国产福利视频在线| 精品麻豆av| 久久爱另类一区二区小说| 黄色一级片在线| 亚洲天堂av在线免费| 欧美日韩午夜电影网| 国产日产欧美视频| 亚洲素人一区二区| 天天干天天舔天天射| 91精品国产综合久久久久久蜜臀| 激情亚洲网站| 亚洲精品国产精品国自| 欧美精品一区二区三区在线播放| 欧美xnxx| 精品国产一区二区三区无码| 国产三级精品三级| 亚洲a视频在线观看| 国产大片精品免费永久看nba| 自拍偷拍欧美专区| 天天躁日日躁aaaa视频| 精品久久久久av影院| jizz欧美| jizzjizz国产精品喷水| 亚洲欧美区自拍先锋| 黄视频在线观看免费| 国产精品裸体一区二区三区| 欧美96一区二区免费视频|