3.鏈表

鏈表

1. 鏈表和鏈表節(jié)點的實現(xiàn)

每個鏈表節(jié)點使用一個adlist.h/listNode結構來表示

typedef struct listNode{

    // 前置節(jié)點
    struct listNode *prev;

    // 后置節(jié)點
    struct listNode *next;

    // 節(jié)點的值
    void *value;
}listNode;

使用adlist.h/list來持有鏈表的話,操作起來會更方便:

typedef struct list{

    // 表頭節(jié)點
    listNode *head;

    // 表尾節(jié)點
    listNode *tail;

    // 鏈表所包含的節(jié)點數(shù)量
    unsigned long len;

    // 節(jié)點值復制函數(shù)
    void *(*dup)(void *ptr);

    // 節(jié)點值釋放函數(shù)
    void (*free)(void *ptr);

    // 節(jié)點值對比函數(shù)
    int (*match)(void *ptr,void *key);
}list;

Redis鏈表實現(xiàn)的特性如下:

  1. 雙端:鏈表節(jié)點帶有prev和next指針,獲取某個節(jié)點的前置節(jié)點和后置節(jié)點的復雜度都是O(1)。
  2. 無環(huán):表頭節(jié)點的prev指針和表尾節(jié)點的next指針都指向NULL,對鏈表的訪問以NULL為終點。
  3. 帶表頭指針和表尾指針:通過list結構的head指針和tail指針,程序獲取鏈表的表頭節(jié)點和表尾節(jié)點的復雜度為O(1)。
  4. 帶鏈表長度計數(shù)器:程序使用list結構的len屬性來對list持有的鏈表節(jié)點進行計數(shù),程序獲取鏈表中節(jié)點數(shù)量的復雜度為O(1)。
  5. 多態(tài):鏈表節(jié)點使用void*指針來保存節(jié)點值,并且可以通過list結構的dup、free、match三個屬性為節(jié)點值設置類型特定函數(shù),所以鏈表可以用于保存各種不同類型的值。
由list結構和listNode結構組成的鏈表

2. 鏈表和鏈表節(jié)點的API

函數(shù) 作用 時間復雜度
listSetDupMethod 將給定的函數(shù)設置為鏈表的節(jié)點值復制函數(shù) 復制函數(shù)可以通過鏈表的dup屬性直接獲得,O(1)
listGetDupMethod 返回鏈表當前正在使用的節(jié)點值復制函數(shù) O(1)
listSetFreeMethod 將給定的函數(shù)設置為鏈表的節(jié)點值釋放函數(shù) 釋放函數(shù)可以通過鏈表的free屬性直接獲得,O(1)
listGetFreeMethod 返回鏈表當前正在使用的節(jié)點值釋放函數(shù) O(1)
listSetMatchMethod 將給定的函數(shù)設置為鏈表的節(jié)點值對比函數(shù) 對比函數(shù)可以通過鏈表的match屬性直接獲得,O(1)
listGetMatchMethod 返回鏈表當前正在使用的節(jié)點值對比函數(shù) O(1)
listLength 返回鏈表的長度(包含了多少個節(jié)點) 鏈表長度可以通過鏈表的len屬性直接獲得,O(1)
listFirst 返回鏈表的表頭節(jié)點 表頭節(jié)點可以通過鏈表的head屬性直接獲得,O(1)
listLast 返回鏈表的表尾節(jié)點 表尾節(jié)點可以通過鏈表的tail屬性直接獲得,O(1)
listPrevNode 返回給定節(jié)點的前置節(jié)點 前置節(jié)點可以通過節(jié)點的prev屬性直接獲得,O(1)
listNextNode 返回給定節(jié)點的后置接地那 后置節(jié)點可以通過節(jié)點的next屬性直接獲得,O(1)
listNodeValue 返回給定節(jié)點目前正在保存的值 節(jié)點值可以通過接地那的value屬性直接獲得,O(1)
listCreate 創(chuàng)建一個不包含任何節(jié)點的新鏈表 O(1)
listAddNodeHead 將一個包含給定值的新節(jié)點添加到給定鏈表的表頭 O(1)
listAddNodeTail 將一個包含給定值的新節(jié)點添加到給定鏈表的表尾 O(1)
listInsertNode 將一個包含給定值的新節(jié)點添加到給定節(jié)點的之前或之后 O(1)
listSearchKey 查找并返回鏈表中包含給定值的節(jié)點 O(N),N為鏈表長度
listIndex 返回鏈表在給定索引上的節(jié)點 O(N),N為鏈表長度
listDelNode 從鏈表中刪除給定節(jié)點 O(N),N為鏈表長度
listRotate 將鏈表的表尾節(jié)點彈出,然后將被彈出的節(jié)點插入到鏈表的表頭,稱為新的表頭節(jié)點 O(N),N為鏈表長度
listDup 復制一個給定鏈表的副本 O(N),N為鏈表長度
listRelease 釋放給定鏈表,以及鏈表中的所有節(jié)點 O(N),N為鏈表長度
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 鏈表提供了高效的節(jié)點重排能力,以及順序性的節(jié)點訪問方式,并且可以通過增刪節(jié)點來靈活的調整鏈表的長度。鏈表鍵的底層實...
    豬大金閱讀 261評論 0 0
  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法,這個一星期,我總結了,我所學習和思考的單鏈表基礎知識...
    醒著的碼者閱讀 4,734評論 1 45
  • 基本概念 鏈表的含義: 鏈表是一種用于存儲數(shù)據(jù)集合的數(shù)據(jù)結構,具有以下屬性 相鄰元素之間通過指針相連 最后一個元素...
    古劍誅仙閱讀 1,057評論 0 3
  • 1. 鏈表是什么? 順序表的缺點添加和刪除操作需要移動元素。當數(shù)據(jù)量特別大的情況,可能沒有連續(xù)的內存可使用。 鏈表...
    jdzhangxin閱讀 756評論 0 1
  • 1、 時隔一年,重回職場,連自己都覺得有點突然。 今天是上班第一天,沒有刻意。作息和之前一樣。 5點半起床,洗漱,...
    蝶舞的陽光房閱讀 965評論 2 5

友情鏈接更多精彩內容