精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产香蕉精品| 欧美性猛交xxx乱大交3蜜桃| 亚洲福利国产| 亚洲欧美国产视频| 天堂一区在线观看| 中文字幕有码在线视频| 99精品欧美一区二区蜜桃免费 | 在线观看欧美精品| 椎名由奈jux491在线播放| 亚洲精品一区二区三区四区 | 欧美在线视频一二三| 国产aⅴ激情无码久久久无码| 欧美日韩卡一| 精品久久中文字幕| 欧美aaa在线观看| 天堂a√在线| 精品中文字幕一区二区小辣椒| 久久久久久久91| 91狠狠综合久久久久久| 国产福利资源一区| 欧美日本不卡视频| 久久久久狠狠高潮亚洲精品| 亚洲丝袜一区| 国产精品入口麻豆原神| 精品不卡在线| 精品人妻无码一区二区三区蜜桃一| 噜噜噜在线观看免费视频日韩| 欧美理论片在线观看| 国产jjizz一区二区三区视频| 91精品啪在线观看国产爱臀| 欧美日韩成人高清| 一本久道中文无码字幕av| 福利小视频在线| 自拍偷拍国产亚洲| 五月天亚洲综合小说网| 国内爆初菊对白视频| 国产一区激情在线| 国产精品流白浆视频| 亚洲黄色小说图片| 亚洲三级免费| 欧美高清视频一区二区| 小泽玛利亚一区二区免费| 精品毛片免费观看| 亚洲欧美国产日韩天堂区| 亚洲天堂美女视频| 国产成人aa在线观看网站站| 欧美一级久久久| 国产女同无遮挡互慰高潮91| 99久久综合国产精品二区| 一本一道波多野结衣一区二区| 国产欧美日韩网站| av中文字幕在线观看第一页| 一个色综合网站| 黄网站色视频免费观看| 宅男网站在线免费观看| 亚洲美女一区二区三区| 亚洲精品天堂成人片av在线播放| 免费看a在线观看| 中文字幕不卡在线播放| 亚洲精品日韩精品| 欧美尤物美女在线| 亚洲免费av高清| 成年女人18级毛片毛片免费| 黄色大片在线| 精品成人在线视频| 黄色动漫在线免费看| 欧美magnet| 欧洲色大大久久| 中文字幕av不卡在线| 欧美xxxx网站| 日韩三级在线免费观看| 日本天堂在线播放| 日韩精选在线| 一本色道久久综合亚洲精品小说| 欧美a在线播放| 91久久国产| 久久久久久久91| 免费观看日批视频| 久久99精品久久久久| 999在线观看免费大全电视剧| 亚洲欧美黄色片| 久久亚洲精品小早川怜子| 亚洲春色在线视频| 中日韩高清电影网| 欧美性猛交xxxx久久久| 午夜激情av在线| 久久影院一区二区三区| 亚洲激情自拍图| 亚洲综合第一区| 欧美freesex交免费视频| 992tv成人免费影院| 伊人久久久久久久久久久久| 激情综合亚洲精品| 国产日韩欧美二区| 超碰免费97在线观看| 伊人夜夜躁av伊人久久| 久久久免费视频网站| 99久久999| 精品无人国产偷自产在线| 欧美色图17p| 亚洲伦理精品| 成人免费直播live| 男女污污视频在线观看| 亚洲欧洲中文日韩久久av乱码| 国产中文字幕视频在线观看| 99久久精品一区二区成人| 亚洲成人aaa| 国产精品情侣呻吟对白视频| 日韩视频不卡| 91欧美激情另类亚洲| 欧美拍拍视频| 亚洲福利视频三区| caoporm在线视频| 国产99精品| 久久久久国产一区二区三区| 影音先锋国产在线| 91麻豆精品在线观看| 亚洲激情免费视频| 韩国精品视频在线观看| 亚洲国产成人精品电影| 加勒比婷婷色综合久久| 日韩不卡一二三区| 久久视频在线观看中文字幕| 污污网站在线看| 欧美久久婷婷综合色| 国产ts在线播放| 亚洲精品男同| 岛国视频一区免费观看| 麻豆传媒视频在线观看免费| 在线一区二区三区四区| 性久久久久久久久久| 亚洲高清网站| 91嫩草视频在线观看| 欧美激情二区| 精品视频1区2区3区| 男人舔女人下部高潮全视频| 久久不射网站| 久久综合色一本| 国产高清中文字幕在线| 精品国产露脸精彩对白| 九九热只有精品| 国产高清久久久久| 日本a级片在线观看| 国产美女精品视频免费播放软件| 中文字幕在线看视频国产欧美在线看完整 | 中文字幕日韩一区二区| 中文字幕在线观看第三页| 免费一区二区| 欧美一性一乱一交一视频| 亚洲av成人精品日韩在线播放| 亚洲妇女屁股眼交7| 国产白袜脚足j棉袜在线观看| 永久亚洲成a人片777777| 91精品国产综合久久香蕉922| 91啦中文在线| 欧美日本一区二区三区四区 | 亚洲成人精品一区二区| 老司机午夜免费福利| 亚洲国产日韩欧美一区二区三区| 古典武侠综合av第一页| 888av在线视频| 日韩精品视频免费在线观看| 亚洲AV无码成人精品区东京热| 91麻豆国产在线观看| 四虎永久在线精品无码视频| 免费欧美激情| 国产区亚洲区欧美区| 国产成人午夜| 精品国产免费一区二区三区四区 | 最新国产拍偷乱拍精品| 久久精品国产综合精品| 日韩成人高清| 久久久国产在线视频| 99久久久久久久| 午夜久久久久久久久久一区二区| 欧美高清性xxxx| 日本怡春院一区二区| 国产精品av免费| 国产精品天天看天天狠| 日韩av手机在线看| 黄色网页在线播放| 日韩av网站大全| 中国女人真人一级毛片| 亚洲精品老司机| 欧美bbbbb性bbbbb视频| 国精产品一区一区三区mba视频| 999久久欧美人妻一区二区| 五月国产精品| 91久久国产精品91久久性色| freexxx性亚洲精品| 在线视频精品一| 懂色av成人一区二区三区| 色综合久久久久网| 欧美日韩中文字幕在线观看| 久久夜色精品国产噜噜av| 超碰91在线播放| 免费一级欧美片在线播放| 国产高潮呻吟久久久| 青青草原在线亚洲| 91亚洲精品在线| 日韩电影免费观看高清完整版| 久久综合伊人77777| 免费福利在线观看| 日韩精品一区二区三区在线观看 | 欧美人禽zoz0强交| 久久色视频免费观看| 小日子的在线观看免费第8集| 久久综合图片| 国产精品国产亚洲精品看不卡| 99re6这里只有精品| 欧美成人一区二区在线| 日韩欧洲国产| 成人黄色免费片| 电影久久久久久| 欧美亚洲国产视频| 欧美日韩经典丝袜| 北条麻妃一区二区三区中文字幕| 亚洲 欧美 激情 另类| 欧美成人在线直播| 国产理论视频在线观看| 色综合 综合色| 国产成人亚洲欧洲在线| 亚洲最大色网站| 国产一二三区精品| 国产精品理论片| 日本欧美一区二区三区不卡视频| 99re在线精品| 老熟女高潮一区二区三区| 久草中文综合在线| 在线观看国产中文字幕| 日韩vs国产vs欧美| 成人在线观看a| 亚洲欧美日韩国产| 99热在线这里只有精品| 最新成人av网站| 精品国产一区三区| 最新亚洲一区| 日韩免费视频播放| 亚洲美女黄色| 777精品久无码人妻蜜桃| 极品尤物久久久av免费看| 国产精品国三级国产av| 欧美激情视频一区二区三区免费| 可以在线看黄的网站| 亚洲h色精品| 男人j进女人j| 欧美午夜一区| 欧美午夜小视频| 亚洲国产国产亚洲一二三| 国产一二三区在线播放| 红桃视频国产精品| 日韩视频在线视频| 国产情侣久久| 热久久精品国产| 日韩电影在线免费看| 四季av一区二区| 麻豆91精品视频| 视频区 图片区 小说区| 国产乱码精品一区二区三区五月婷| 97超碰人人看| 成人免费看的视频| 亚洲欧美色图视频| 国产亚洲欧美一区在线观看| 亚洲а∨天堂久久精品2021| 国产精品私人影院| 一区二区成人免费视频| 亚洲影院在线观看| 国产黄色片免费看| 欧美性色黄大片手机版| 97在线播放免费观看| 日韩精品一区二区三区视频 | 欧美巨乳在线观看| √最新版天堂资源网在线| 日本久久久久久| 黄色成人在线观看网站| 91视频免费进入| 色综合久久中文| 亚洲午夜精品一区二区三区| 综合精品一区| 久久久久久久久久久免费视频| 理论电影国产精品| 扒开伸进免费视频| 国产欧美精品在线观看| 国产va在线播放| 日韩欧美一区二区三区| 91尤物国产福利在线观看| 亚洲成人网av| 东热在线免费视频| 欧美日韩高清区| 欧美成人精品三级网站| 亚洲free嫩bbb| 竹菊久久久久久久| 久久精品在线免费视频| 免费在线亚洲欧美| 一级片免费在线观看视频| 久久精品日韩一区二区三区| 五月天av网站| 在线观看一区不卡| 亚洲乱码国产乱码精品精软件| 亚洲欧美日韩第一区| 天堂av最新在线| 国产精品美女av| 久久资源综合| 无码人妻aⅴ一区二区三区日本| 亚洲综合精品四区| 99999精品| 国产精品毛片久久久久久久| 欧美三级韩国三级日本三斤在线观看| 欧美日韩一区二区电影| 日韩a级作爱片一二三区免费观看| 日韩午夜在线视频| 日韩天堂在线| 久久精品日韩精品| 亚洲午夜精品久久久久久app| 欧美一级特黄a| 久久久精品人体av艺术| 国产亚洲精品女人久久久久久| 欧美日韩一区二区三区不卡| 精品美女视频在线观看免费软件| 久久人91精品久久久久久不卡| 久久xxx视频| 欧美极品一区二区| 亚洲国产导航| 国产精品久久久久久在线观看| **网站欧美大片在线观看| 黄色污污视频软件| 日韩精品中文字幕在线播放| 678在线观看视频| 国产富婆一区二区三区| 欧美极品一区二区三区| 午夜国产福利在线观看| 国产精品久久久久一区二区三区共| 天天干天天干天天干天天| 亚洲国产欧美一区二区丝袜黑人| 欧洲中文在线| 99久热re在线精品视频| 一区二区三区四区在线观看国产日韩| 手机视频在线观看| 国产三级三级三级精品8ⅰ区| 欧美精品一二三四区| 日韩成人av网| 手机在线观看av网站| 久久av免费观看| 国产精品女主播一区二区三区| 亚洲av永久无码精品| 亚洲成人在线观看视频| 香蕉人妻av久久久久天天| 97精品国产97久久久久久免费| 久本草在线中文字幕亚洲| 黄网站欧美内射| 久久综合国产精品| 免费又黄又爽又猛大片午夜| 中文国产成人精品久久一| 成人激情视屏| 国产手机视频在线观看| 国产精品乡下勾搭老头1| 精品无码久久久久久久| 亚洲福利在线视频| 一区二区三区短视频| 欧美高清视频一区二区三区在线观看| 老鸭窝毛片一区二区三区| 美国一级黄色录像| 日韩亚洲欧美高清| av在线网页| 日本不卡免费新一二三区| 免费观看日韩电影| 四虎精品免费视频| 亚洲大胆人体av| av有声小说一区二区三区| 亚洲精品9999| 国产成人av自拍| www.中文字幕在线观看| 伊人青青综合网站| 精品视频一区二区三区| 精品少妇人妻av免费久久洗澡| 国产日本欧美一区二区| 99国产精品久久久久99打野战| 久久久久免费精品国产| 国产欧美亚洲精品a| 国产传媒免费观看| 精品女厕一区二区三区| 国产二区在线播放| 91手机在线播放| 午夜在线视频观看日韩17c| 老司机精品免费视频| 亚洲精品在线三区| 日本国产欧美| av免费看网址| 国产精品青草久久| 日韩一区二区三区不卡| 国产精品网站大全| 日韩视频三区| 亚洲熟女少妇一区二区| 日韩成人在线观看| 成人日韩视频| 麻豆av免费在线| 亚洲综合色网站| 午夜视频成人| 欧美二级三级| 丁香天五香天堂综合|