头结点其实就是一个数据域为空的结点(当然也可储存链表的长度之类的数据,一般对链表操作无影响),而首元结点就是第一个元素结点,即头结点后边的第一个结点。
头结点的存在使得空链表与非空链表的处理操作一致,并且在第一个元素结点前插入结点(或删除第一个结点),其操作与对其它结点一致。
怎么理解上面的话呢?你可想象一下,如果不存在头结点,第一个结点就是实际的第一个数据结点这种结构:对于空链表,每当对其进行添加或删除都要判断是否为空(因为若不为空,就可以直接删除或者添加在尾部或中间);若对其进行插入操作,那么就会出现在第一个元素之前插入的操作方式与插入两个元素之间的操作就不一致(因为第一个元素之前并没有结点,无需用指针指定前驱)。
有了头结点,上面所有这些操作都可以统一的代码实现,无需区分特例。