【資料結構與演算法】通俗易懂說連結串列

蝸牛201發表於2019-04-03

一:概述

連結串列(Linked list)由一些節點組成,物理儲存非連續的線性表。其中每個節點都會儲存下個節點的指標,由於實際儲存空間不連續,對連結串列插入節點,刪除節點可以達到O(1)的複雜度,但是對一個節點的訪問需要O(n)的時間。

連結串列有單向連結串列,雙向連結串列。

 

二:單向連結串列

單向連結串列的每個節點有資料項和指標(指向下個節點地址資料)組成,下圖為一個單向連結串列,表頭沒有資料項,只有指向下一個節點的指標。表尾節點指向下一個節點pNext指標為NULL(空)。

結構體表示為:

//單向連結串列節點資料結構
typedef struct linkNode
{
      void *val; //資料項(任意型別)
      struct linkNode *next;
}node;

 

插入節點操作:

單向連結串列中由四個資料節點,資料1,資料2,資料3,資料4,現在資料1和資料2節點間插入資料5,只需把資料1節點的pNext指向新的節點,把新節點的pNext指向資料2節點即可。

刪除節點操作:

刪除節點2,只需把第一個節點的pNext執行資料3節點,同時釋放節點2的儲存空間即可。

 

三:雙向連結串列

雙向連結串列有別於單向的,每個節點除了資料項外有兩個指標分別指向前一個節點和後一個節點,佔用空間會大一些,可以實現從頭到尾的遍歷,又可以從尾到頭遍歷。

結構體表示為:

//雙向連結串列節點資料結構
typedef struct dLinkNode
{
      void *val; //資料項(任意型別)
      struct dLinkNode *prev;      
      struct dLinkNode *next;
}node;

 

插入節點操作:

節點1與節點2之間插入新節點5,需要把節點1的pNext指向節點5,節點5的pHead指向節點1,節點5的pNext指向節點2,節點2的pHead指向節點5,如下圖所示:

 

刪除節點操作:

刪除節點2,把節點1的pNext指向節點3,把節點3的pHead指向節點1,同時釋放節點2的儲存空間即可。

 

四:連結串列與陣列區別

1.連結串列儲存空間不連續,可以充分利用碎片空間,陣列的儲存空間是連續的,記憶體空間要求高,必須要有足夠連續的記憶體空間。

2.連結串列的插入刪除元素簡單,無需對元素移動,但查詢元素會慢,陣列對元素的插入刪除較複雜,同時使用時要預先指定長度,但陣列的查詢會很快。

 

相關文章