線性表的鏈式儲存結構特點
用一組任意的儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。這些資料可以存在記憶體未被佔用的任意位置。
在順序結構中,每個資料元素只需要存資料元素資訊就可以了。
但在鏈式結構中,除了要存資料元素資訊外,還要儲存它的後繼元素的儲存地址。
對資料元素a_i來說,除了儲存其本身的資訊之外,還需儲存一個指示其直接後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域,把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱作指標或鏈。這兩部分資訊組成資料元素a_1的儲存映像,稱為節點(Node)。
對於線性表來說,總得有個頭有個尾,連結串列也不例外。我們把連結串列中第一個節點的儲存位置叫做頭指標,那麼整個連結串列的存取就必須是從頭指標開始進行了。之後的每一個節點,其實就是上一個的後繼指標指向的位置。想象一下,最後一個節點,它的指標指向哪裡?
最後一個,當然就意味著直接後繼不存在了,所以我們規定,線性連結串列的最後一個節點指標為“空”(通常用 NULL 或 “^” 符號表示)
為了更加方便地對連結串列進行操作,會在單連結串列的第一個節點前附設一個節點,稱為頭節點。頭節點的資料域可以不儲存任何資訊。也可以儲存如線性表的長度等附加資訊,頭節點的指標域儲存指向第一個節點的指標。
線性表的鏈式儲存頭節點和頭指標
頭指標
- 頭指標是指連結串列指向第一個節點的指標,若連結串列有頭節點,則是指向頭節點的指標。
- 頭指標具有標識作用,所以常用頭指標冠以連結串列的名字。
- 無論連結串列是否為空,頭指標均不為空。頭指標是連結串列的必要元素。
頭節點
- 頭節點是為了操作的統一和方便而設立的,放在第一個元素的節點之前,其資料域一般無意義。
- 有了頭節點,對在第一元素節點前插入節點和刪除第一節點,其操作與其他節點的操作就統一了。
- 頭節點不一定是連結串列必須要素。
獲得連結串列第 i 個資料的演算法思路
宣告一個指標 p 指向連結串列第一個節點,初始化 j 從 1 開始;
當 j < i 時,就遍歷連結串列,讓 p 的指標向後移動,不斷指向下一節點,j 累加 1;
若到連結串列末尾 p 為空,則說明第 i 個節點不存在;
否則查詢成功,返回節點 p 的資料。
從頭開始找,直到找到第 i 個節點為止。由於這個演算法的時間複雜度取決於 i 的為止,當 i=1 時,則不需遍歷,第一個就取出資料了,而當 i=n 時則遍歷 n-1 次才可以。因此最壞情況的時間複雜度是 O(n)。
單連結串列的結構中沒有定義表長,所以不能事先直到要迴圈多少次,因此也就不方便使用 for 來控制迴圈。其主要核心思想就是“工作指標後移”,這其實也是很多演算法的常用技術。
本作品採用《CC 協議》,轉載必須註明作者和本文連結