每日算法 -- 链表
82. 删除排序链表中的重复元素 II
分析
- 这里是只要重复了,就将所有值都删除了,还有一种题目是,删除多余的值,即去重,需要注意
- 因为是完全删除,所以除了快慢指针,还得有一个前指针 prev,用来删除后连接新链表
- 由于有删除和没有删除的操作是不一样的处理,所以用一个变量指出是否是删除
- 为了防止链表头开始删除,所以需要开启 emptyNode,为了防止链表尾需要删除,所以遍历完了,还需要判断 isDelete 是否还未真,如果是,那么 prev 直接走到 null 即可
// 82. 删除排序链表中的重复元素 II
// https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
/**
* @分析
* 1. 这个链表已经排序了,所以相同的值都在一起了
* 2. 只要快慢指针的值相同,则进行读写操作
*/
var deleteDuplicates = function (head) {
if (!head || !head.next) return head
let emptyNode = prev = new ListNode()
emptyNode.next = head
let slow = head
let fast = head.next
let isDelete = false // 标志是否开启删除模式
while (fast) {
if(fast.val === slow.val){
// 这个时候只有fast 走,同时开启删除模式
isDelete = true
}else{
if(isDelete){
// 删除模式
prev.next = fast
slow = fast
isDelete = false
}else{
prev = prev.next
slow = slow.next
}
}
fast = fast.next
}
// 遍历完了,但是可能最后的那一段是需要删除的
if(isDelete){
// 删除模式
prev.next = fast
}
return emptyNode.next
};
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情