資料結構基礎 鍊錶

2021-07-29 15:42:00 字數 2415 閱讀 5911

1.   

「鍊錶」表明這種資料結構是一種鏈式儲存結構

,它不同於線性表的順序儲存結構。鍊錶的相鄰元素

在物理記憶體中不連續

,所以這種結構可以充分利用一些系統的記憶體碎片來完成一些事務,即如果採用鍊錶結構有時可以解決當連續記憶體分配不足時的問題。

鍊錶支援插入和刪除這兩種操作,並且

刪除/插入鍊錶頭部/尾部結點的時間複雜度通常都是常數級別的,鍊錶的

不足在於不支援高效的random access(隨機訪問)。常用於組織刪除、檢索較少,而新增、遍歷較多的資料。

2.  

鍊錶和陣列的區別:

(1)陣列在記憶體中是逐個存放的,而鍊錶的相鄰元素

在物理記憶體中不連續,呈現一種隨機的狀態;

(2)陣列一旦顯式的被申明後,其大小就固定了,不能動態進行擴充,而鍊錶則可以;

(3)鍊錶靈活,但是空間和

時間額外耗費較大

;陣列大小固定,元素位置固定,但是操作不靈活,且容易浪費空間,但是時間耗費較小。雙向鍊錶比單向的更靈活,但是空間耗費也更大。

(4)從記憶體儲存來看,(靜態

)陣列從棧中分配空間,鍊錶從堆中分配空間

, 自由度大但是申請管理比較麻煩

3.刪除結點:

當需要刪除乙個節點p時,只需要將p的前乙個節點的next賦為p->next,但是由於是單向的,只知道p,無法知道p前乙個節點,所以需要轉換思路。將p下乙個的節點覆蓋到p節點即可,這樣就等效於將p刪除了。

void deletenode(node*p)
4.鍊錶逆置:

包括head

一共要維護

3個指標,

p是原煉表中

head

的下乙個,

temp

是原煉表中

head

的上乙個。

鍊錶中間結點(不知鍊錶長度):

用快慢指標,快的移動

2個位置,慢的移動

1個位置,快的到最後乙個結點,慢的就到中間

找倒數第

k個結點(不知鍊錶長度):

用slow和fast指標標記,fast指標事先走k步,然後slow和fast同時走,當fast到達末節點時,slow在fast的前k個節點,即為倒數第k個節點。

7.

反向遍歷鍊錶:

鍊錶排序:

第一種方法:轉為陣列,用

sort

後再賦值給鍊錶結點

第二種方法:借助

multimap

的自動排序功能

第三種方法:歸併排序

的非遞迴實現:

鍊錶相交問題:

方法一:如果兩個鍊錶相交,其形狀必為y形,而不可以能為x形,即兩條鍊錶必有相同的尾節點。首先,計算得到兩個鍊錶的長度:m,n,求得兩個鍊錶長度之差distance=|m-n|,讓較長得那個鍊錶事先走distance步,這樣,若是鍊錶相交得話,二者指標必相撞,相撞點即為相交點。

方法二:同時走,走完自己的走另一條,沒有交點則都會走m+n,若有交點,則會在交點處相遇。

鍊錶環問題:

傳送門

資料結構基礎 鍊錶

typedef struct node node typedef struct node linklist 思路 獲取第i個資料 1.宣告乙個指標p指向鍊錶的第乙個結點,初始化j從1開始 2.當jgeteelm linklist l,int i,elemtype e if p j i e p dat...

資料結構基礎 四 鍊錶

鍊錶是一種物理儲存單元上非連續 非順序的儲存結構。資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。與陣列對應,陣列是 是一種物理儲存單元上連續 順序的儲存結構。資料元素的邏輯順序是通過下標次序實現的。鍊錶又分為單向鍊錶 雙向鍊錶。單向鍊錶 每個資料結點中只有乙個指標,指向後繼節點。雙向鍊錶 每個...

資料結構基礎 鍊錶練習

例題6 4 破損的鍵盤 鍊錶 include include const int maxn 100000 5 int last,cur,next maxn 游標位於cur號字母的後面 char s maxn int main for int i next 0 i 0 i next i printf ...