哨兵节点
在没有哨兵节点时
对链表进行插入操作时,需要判断当前链表是否有节点,代码大致如下:
if(head == null){
head = newNode();
}
else{
newNode.next = current.next;
current.next = newNode;
}
在进行删除操作时,需要判断删除的是否是最后一个节点,代码大致如下:
if(head.next == null){
head = null;
}
else{
current.next = current.next.next;
}
有哨兵节点时
对链表进行插入操作时,需要判断当前链表是否有节点,代码大致如下:
newNode.next = current.next;
current.next = newNode;
在进行删除操作时,需要判断删除的是否是最后一个节点,代码大致如下:
current.next = current.next.next;
因为哨兵节点始终会存在,索引在进行插入或者删除操作时,不用考虑链表是否为空,是否为最后一个节点,
简化了链表操作。
链表注意点
- 如果链表为空时,代码是否能正常工作?
- 如果链表只包含一个结点时,代码是否能正常工作?
- 如果链表只包含两个结点时,代码是否能正常工作?
- 代码逻辑在处理头结点和尾结点的时候,是否能正常工作?
练习题
leetcode中对应的练习题目有:
- 206(单链表反转),141(链表中环的检测)
- 21(两个有序链表的合并)
- 19(删除链表倒数第n个节点)
- 87(求链表的中间节点)