知识点收集于网络,我会加以总结,如果把预备知识学好了。那么后面的操作就不难了
用节或者结都可以,不要在意字的差别
目录
一、头指针与头结点的概念
二、链表带头结点和不带头节点的区别
三、八大链表类型:
四、链表节点为什么需要动态开辟
五、各类链表判空的条件
一、头指针与头结点的概念
1、头指针
通常使用“头指针”来标识一个链表。无论链表是否有头结点,头指针始终指向链表的第一个节点。如果有头结点,头指针就指向头结点。
2、头结点
在单链表的第一个节点之前附加一个节点,称为头结点。头结点的data域可以不设置任何信息,也可以记录表长等相关信息。但通常是不存储信息的。
二、链表带头结点和不带头节点的区别
设置头结点有什么好处?
A、第一个有效数据的节点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其他位置一样,无需特殊处理了。
B、便于空表和非空表的统一处理,无论链表是否为空,头指针都是指向头结点的非空指针。因此空表和非空表的处理也就统一了。
三、八大链表类型:
1、单向与双向
2、带头节点和不带头结点(又称带哨兵位头和不带哨兵位头)
3、循环和非循环
四、链表节点为什么需要动态开辟
为什么c链表节点要用malloc函数动态分配大小?因为在c语言中链表节点的大小是不确定的,因为他需要根据实际存储的数据类型和节点前后指针的大小进行调整。而我们之前学的顺序表,它的大小是可以固定的,也可以说是动态的。但是这里链表严格是要动态的才行
五、各类链表判空的条件
1、单链表
带头节点:若带有头结点的链表为空,只需要整条链表只剩一个头结点,只需要头结点的后继节点不存在即可,即第一个存储数据的节点不存在即可,即头结点的next指针域为NULL。所以带头节点的单链表的判空条件:head->next==NULL
不带头结点:不带头节点的链表若要为空,整个链表不能存在一个结点。即只需要第一个节点不存在即可。所以不带头节点的单链表的判空条件为head==NULL
2、双向链表
带头节点的双向链表判空条件:head->next==NULL
不带头节点的双向链表判空条件:head==NULL
3、循环单链表
带头节点的:链表为空头结点仍然存在,同时需要满足循环,所以带头节点的循环单链表的判空条件:head->next==head;
不带头节点的循环单链表的判空条件:head==NULL
4、循环双链表
带头节点的判空条件有很多
比如
head->next == head
head->next == head->prior
head->prior == head
head->next == head && head->prior == head
不带头节点:head==NULL
总结:不带头节点的判空条件永远都是head==NULL
带头节点的判空条件可以自己画图判断条件