哨兵节点
哨兵节点解决什么问题?
- 问题: 被操作的位置在第一个结点时, 需要单独判断并修改外部持有的
head引用; - 哨兵: 在
head前挂一个值无意义的dummy, 所有增删都发生在dummy之后; - 返回: 结果链表一律从
dummy.next取;
const dummy = new ListNode(-1, head);
// ... 在 dummy 之后增删
return dummy.next;
删除排序链表中的重复元素时都要哨兵吗?
| 题 | 删除规则 | 需要哨兵 | 原因 |
|---|---|---|---|
| 83 | 重复元素保留一个 | 否 | head 一定被保留 |
| 82 | 重复出现的元素全部删除 | 是 | head 可能整段被删掉 |
- 83:
current.val === current.next.val时current.next = current.next.next, 否则current = current.next; - 82: 用
pre指向已确认保留的尾结点, 用cur扫描相同值的一段, 一次性pre.next = cur.next;
// 83
const deleteDuplicates = (head) => {
let cur = head;
while (cur && cur.next) {
if (cur.val === cur.next.val) cur.next = cur.next.next;
else cur = cur.next;
}
return head;
};
// 82
const deleteDuplicatesAll = (head) => {
const dummy = new ListNode(-1, head);
let pre = dummy;
let cur = head;
while (cur && cur.next) {
if (cur.val !== cur.next.val) {
pre = cur;
cur = cur.next;
} else {
while (cur.next && cur.val === cur.next.val) cur = cur.next;
pre.next = cur.next;
cur = cur.next;
}
}
return dummy.next;
};