203. 删除链表元素 && 82. 删除排序链表中的重复元素 II

题目地址

https://leetcode-cn.com/problems/remove-linked-list-elements/

imooc讲解地址

https://coding.imooc.com/lesson/82.html#mid=2671

  • 学习点
  1. 感受不使用虚拟头节点,单独处理头节点的坑和不优雅。
  2. 一种不用设置虚拟节点的处理方法
  • 扩展
    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

21. 合并两个有序链表

82. 删除排序链表中的重复元素 II

速记: 定位最后一个重复元素,即可知道需要保留的子链头节点。

原文地址:https://www.cnblogs.com/yudidi/p/12558414.html