引入和介绍
最近在做链表算法题目的时候,许多人都会在创建新链表的时候加入一个哨兵,那么为什么要加入这个哨兵呢?
什么是链表中的哨兵?
哨兵其实是一个解点,哨兵节点(Sentinel)是一个哑元节点,可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,它的值域并不存储任何东西,只是为了操作的方便引入的。如果一个链表中有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。
在绝大多数情况下,链表分为带头结点的链表和不带头结点的链表,如果是处理没有带哨兵节点的链表,对第一个节点,既是头节点,没有前驱节点。如果没有做特殊处理来操作的话,那么就可能出错但是如果做特殊处理,那么就会增加代码的复杂性,还会减低程序的效率。而如果有带哨兵节点的链表,线性表的每个位置的节点都有一个前趋节点,因此可以做统一的处理。
对于空的链表,没有带哨兵节点的链表的头结点为Null,处理起来和其他情况也不同。而带了哨兵节点的链表,当其为一个空链表时,仅含哨兵节点,哨兵节点的指针域为空,和其他情况的表尾是一样的。
反思:
有带哨兵的节点的时候,对于链表的增删改都会方便许多。
对于创建一个新的链表:
1、没有哨兵节点时,添加一个节点要先判断是否是第一个节点,并单独保留第一个节点的指针,以便于返回整个链表的头指针。
2、有哨兵节点时,链表头是固定的,不可能为空,后续的节点都是链接在前一个节点的,不需要单独判断是否为头节点。
对于插入一个节点
有哨兵节点时,不需要判断链表为空和插入点在第一个位置节点的情况。
对于删除指定位置的节点
有哨兵节点时,不需要判断链表为空和删除第一个位置节点的情况。