链表的定义
鏈表
鏈表的概念
定義:鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。
在鏈表的儲存上,每個結(jié)點不僅包含所存的元素信息,還包含元素間的邏輯信息。
鏈表的特性
- 不支持隨機(jī)訪問:不能通過知道第一個元素的地址(即儲存空間的首地址)可以輕松訪問儲存的所有數(shù)據(jù)。
- 節(jié)點的儲存空間利用率相對順序表較低:鏈表中的每分一個結(jié)點需要劃出一部分空間來儲存指向下一個結(jié)點位置的指針
- 支持儲存空間的動態(tài)分配:鏈表中當(dāng)前結(jié)點的位置是由其前驅(qū)結(jié)點中的地址信息所指示的。其結(jié)點可以散落在內(nèi)存中的任意位置,且不需要一次性地劃分所有結(jié)點所需的空間給它。
- 在鏈表中進(jìn)行插入操作無需移動元素(而順序表需要)
鏈表的形式
單鏈表
在每個結(jié)點除了包含的數(shù)據(jù)域外,還包含一個指針域,用以指向其后繼結(jié)點。
- 帶頭結(jié)點的單鏈表
帶頭結(jié)點的單鏈表中,頭指針head指向頭結(jié)點,頭結(jié)點的值域不含任何信息,從頭結(jié)點的后繼結(jié)點開始儲存信息。頭指針head 始終不等于NULL,head->next等于NULL的時候,鏈表為空。
- 不帶頭結(jié)點的單鏈表
不帶頭結(jié)點的單鏈表中的頭指針head直接指向開始結(jié)點,當(dāng)head等于NULL時,鏈表為空。
雙鏈表
雙鏈表就是在單鏈表結(jié)點上增添了一個指針域,指向當(dāng)前節(jié)點的前驅(qū)。
相比于單鏈表,雙鏈表能夠從終端結(jié)點反向走到開始結(jié)點。
循環(huán)鏈表
- 循環(huán)單鏈表
只需要將單鏈表最后一個指針域(空指針)指向鏈表中的第一個結(jié)點即可。(如果循環(huán)單鏈表帶頭結(jié)點,則指向頭結(jié)點;不帶頭結(jié)點,則指向開始結(jié)點)。
循環(huán)單鏈表可以實現(xiàn)從任何一個結(jié)點出發(fā),訪問鏈表中任何結(jié)點。(注意:此處應(yīng)該區(qū)分與順序表隨機(jī)訪問的特點。循環(huán)單鏈表指的是從一個結(jié)點出發(fā),而不是知道一個結(jié)點從而迅速找到任何一個結(jié)點,因此循環(huán)單鏈表不具有隨機(jī)訪問特性。)
帶頭結(jié)點的循環(huán)單鏈表,當(dāng)head等于head->next時,鏈表為空;不帶頭結(jié)點的循環(huán)單鏈表,當(dāng)head等于NULL時,鏈表為空。
- 循環(huán)雙鏈表
雙鏈表終端節(jié)點的next指針指向鏈表中第一個結(jié)點,將鏈表中的第一個結(jié)點的prior指針指向終端結(jié)點。
不帶頭結(jié)點的循環(huán)雙鏈表,head等于NULL,鏈表為空
帶頭結(jié)點的循環(huán)雙鏈表是沒有空指針的,其為空狀態(tài)下,head->next與head->prior必然都等于head,故一下四種語句都可判斷為空
head->next == head; head->prior == head; head->next == head && head->prior == head; head->next == head || head->prior == head;靜態(tài)鏈表
靜態(tài)鏈表借助一維數(shù)組表示。
靜態(tài)鏈表結(jié)點空間來自于一個結(jié)構(gòu)體數(shù)組(一般鏈表結(jié)點空間來自整個內(nèi)存),數(shù)組中每個結(jié)點含兩個分量:
- 數(shù)據(jù)元素分量data
- 指針分量(指示了當(dāng)前結(jié)點直接后繼節(jié)點在數(shù)組中的位置)
注意:靜態(tài)鏈表的指針不是通常所說儲存內(nèi)存地址的指針型變量,而是儲存數(shù)組下標(biāo)的整型變量,其功能類似于指針,故在此稱為指針
順序表與鏈表區(qū)別
基于空間比較
- 儲存的分配方式
順序表儲存空間時一次性分配的,鏈表的是多次分配的
- 存儲密度
(注: 存儲密度 = 結(jié)點值域所占存儲量/結(jié)點結(jié)構(gòu)所占存儲總量)
順序表存儲密度 = 1
鏈表存儲密度 < 1
基于時間的比較
- 存取方式
順序表可以隨機(jī)存取,也可以順序存取
鏈表只能順序存取
- 插入/刪除時移動元素個數(shù)
順序表平均需要移動一半元素
鏈表不需要移動元素,僅需修改指針
總結(jié)
- 上一篇: 顺序表的概念及定义
- 下一篇: 算法题——Cantor表