单链表:带头结点与不带头结点详解
在本人的另一篇文章中,通过java实现了带头结点和不带头结点的单链表,有兴趣的小伙伴可以去看下数据结构(一):链表(Linked List)
这两天回顾下链表的知识,关于单链表带头结点和不带头结点有点迷糊了,就去网上查询了下,结果查完心态都炸了。看的整个人更懵逼了!!!
网上大部分对于带头结点和不带头结点的文章,对不带头结点的链表的表头插入结点
的代码,都是错的。我简单截几个图:
正确的步骤应该如下
x->next = head;//此处x是待插入结点
head = x;
下面我们讲下具体带头结点和不带头结点的一个情况。
头指针:通常使用“头指针”来标识一个链表,如单链表L,头指针为NULL的时表示一个空链表。链表非空时,头指针指向的是第一个结点的存储位置。
头结点:在单链表的第一个结点之前附加一个结点,称为头结点。头结点的Data域可以不设任何信息,也可以记录表长等相关信息。若链表是带有头结点的,则头指针指向头结点的存储位置。
无论是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点(只不过头结点的数据域为空而已)。
这里就有个问题:为什么链表要区有带头结点和不带头结点两种?
答案很简单,为了方便。就跟记事本也可以写代码,你却更喜欢编辑器一样的。
具体操作上方便在哪里,我们接下来看下。
①不带头结点的链表,在表头插入结点
x->next = head;
head = x;
不带头结点的链表,在表头以外的地方插入结点
x->next = p->next;
p->next = x;
②带头结点的链表,在第一个位置插入结点
x->next = p->next;
p->next = x;
带头结点的链表,在其他位置插入结点
x->next = p->next;
p->next = x;
这个时候你会发现,不带头结点的链表的两种情况操作步骤不一样;而带头结点的两种情况操作步骤是一样的。是不是对插入操作就方便了呢!
参考文章:https://blog.csdn.net/c_base_jin/article/details/103115079(某些定义参考)