要区分头指针,头结点,首元结点这几个概念分别指什么,需要结构图来帮助阐释。
我们先来看一种不太严谨的表现形式。
1->2->3->4->NULL
头结点这个名词很具有迷惑性。比如这张图中,刚接触的新手很容易以为1就是来自头结点的数据域。但其实这个结构里我们是看不到头结点的。我们只能看到首元结点,也就是说这个1是首元结点数据域里的元素。所以首元结点,才是链表里第一个数据元素存储的位置。
单链表第一种结构:带头结点
第一种结构之中存在头结点。头结点位于首元结点之前,其数据域一般是没有意义的,有的时候可以存放一些指示信息。头指针head指向头结点。头结点指针域中的head->next指向首元结点地址。这个时候要取出首元结点数据域的元素,我们是用head->next->data来实现。
单链表第二种结构:不带头结点
这种结构中是没有头结点存在的,要注意刷题网站LeetCode中的链表题默认的都是这种结构,否则刷题容易踩坑。
头指针head指向首元结点,也就是第一个数据元素的存储位置,这个时候我们直接可以用head->data取出该结点数据域内的元素。head->next自然指向第二个数据元素的存储位置。
总结
头结点可带可不带。如果有头结点则头指针指向头结点(首元结点的前一个结点),如果没有头结点则头指针指向首元结点。