「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。
示例 1:
输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]
力扣(LeetCode)链接:leetcode-cn.com/problems/re…
解题思路
- 这道题和第 83 题 删除排序链表中的重复元素 类似,区别是第 83 题保留重复节点中的一个,这道题要删除所有重复节点
- 链表为有序链表,相同节点是连续的
- 创建一个假头节点,next 指向 head,把头节点重复的情况变成一般情况
- 遍历链表,以下两种情况删除当前节点:
- 当前节点的值等于下个节点的值
- 当前节点的值等于上次删除节点的值
- 处理边界条件,head 为空时返回 head
示例 2:
输入: head = [1,1,2,3,3,4,5]
输出: [2,4,5]
代码实现
var deleteDuplicates = function(head) {
if (!head) return head
let weakHead = new ListNode(null, head)
let curr = weakHead
let prev = weakHead
let delNode = null
while (curr) {
//两种情况删除当前节点:
//1.当前节点值等于下一个节点的值
//2.当前节点值等于上个删除节点的值
if ((curr.next && curr.val === curr.next.val) ||
(delNode && curr.val === delNode.val)) {
delNode = curr
prev.next = curr.next
curr = curr.next
} else {
prev = curr
curr = curr.next
}
}
return weakHead.next
}
如有错误欢迎指出,欢迎一起讨论!