當鏈表的每個結點只包含一個指針域時,我們稱此鏈表為單鏈表。
關於單鏈表的存取,有時候我們在單鏈表的第一個結點(有效元素)之前附設一個結點,稱之為頭結點;指向頭結點的指針,稱之為頭指針;對單鏈表的存取必須從頭指針開始進行,由於單鏈表的最后一個數據元素沒有直接后繼,則指針為NULL。

對於頭結點,數據域可以不存儲任何信息,也可存儲如鏈表長度等附加信息。
下面是帶頭結點的單鏈表與空表的比較圖。

頭指針與頭結點不同,頭結點即第一個結點,頭指針是指向第一個結點的指針。鏈表中可以沒有頭結點,但不能沒有頭指針。
以下是頭指針與頭結點的關系:
//定義結點的結構體 typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList;
則定義LinkList L;時,L為鏈表的頭指針。
L=(LinkList) malloc (sizeof(LNode)); //創建一個結點
此處返回給L的是一個指針,並且賦給了頭指針。
L->next=null; //這里說明我創建了一個頭結點,即同時運用了頭指針和頭結點。
小結
關於頭指針:
- 在線性表的鏈式存儲結構中,頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則頭指針就是指向鏈表頭結點的指針。
- 頭指針具有標識作用,故常用頭指針冠以鏈表的名字。
- 無論鏈表是否為空,頭指針均不為空。頭指針是鏈表的必要元素。
關於頭結點:
- 頭結點是為了操作的統一與方便而設立的,放在第一個元素結點之前,其數據域一般無意義(當然有些情況下也可存放鏈表的長度、用做監視哨等等)。
- 有了頭結點后,對在第一個元素結點前插入結點和刪除第一個結點,其操作與對其它結點的操作統一了。
- 首元結點也就是第一個元素的結點,它是頭結點后邊的第一個結點。
- 頭結點不是鏈表所必需的。