203. 删除链表元素 && 82. 删除排序链表中的重复元素 II
题目地址
https://leetcode-cn.com/problems/remove-linked-list-elements/
imooc讲解地址
https://coding.imooc.com/lesson/82.html#mid=2671
- 学习点
- 感受不使用虚拟头节点,单独处理头节点的坑和不优雅。
- 一种不用设置虚拟节点的处理方法
- 扩展
Q: 什么情况应该设置dummy head(虚拟头节点)
A: 不知道返回的头节点时。
1.删除链表元素。头节点可能被删除。
2.合并有序链表。因为也不直到合并后是要返回哪个节点作为头节点的。
使用虚拟头节点使得链表永不为空(永不无头),从而统一处理逻辑的过程。
代码
func removeElements(head *ListNode, val int) *ListNode {
if head == nil {
return nil
}
// 给链表扩展一个虚拟头节点
dummy := &ListNode{Next: head}
// 遍历链表,判断下一个节点是否是被删除节点
cur := dummy
for cur.Next != nil {
if cur.Next.Val == val {
cur.Next = cur.Next.Next
} else {
cur = cur.Next
}
}
return dummy.Next
}
练习
82. 删除排序链表中的重复元素 II
https://www.cnblogs.com/yudidi/p/12558417.html
82. 删除排序链表中的重复元素 II
速记: 定位最后一个重复元素,即可知道需要保留的子链头节点。