「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
题目:
82. 删除排序链表中的重复元素 II
存在一个按升序排列的链表,给你这个链表的头节点 head
,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 **的数字。
返回同样按升序排列的结果链表。
示例 1:
输入: head = [1,2,3,3,4,4,5]
输出: [1,2,5]
复制代码
示例 2:
输入: head = [1,1,1,2,3]
输出: [2,3]
复制代码
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序排列
思路:
- 因为链表已经是经过升序排列的,所以我们只需要比较当前节点和下一个节点的值的大小,但是这道题比较难一点,它需要把原来的元素也进行删除, 新增变量
isDup
记录是否删除当前节点; - 可能头指针需要删除,为了避免每次循环进行判断, 我们在头指针前面插入一个节点
result
; - 因为待会儿要返回整个链表,所以我们找个需要找个代跑
prev
, 以保留result
头指针的位置; - 这样子我们每次只需要比较当前节点
prev.next
和下个节点prev.next.next
是否相同即可, 到这里可能有点绕,因为我们要可能要删除当前节点, 所以我们直接赋值prev
为当前节点,而需要往前取一个元素; - 如果当前节点与下一个节点的值相同,删除下一个元素,同时标记一下
isDup = true
, 先继续匹配还有没有相同的值, 如果没有了下一轮删除掉当前节点。
实现:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
// 标识是否已经重复, 如果是要删除当前节点
let isDup = false;
let result = new ListNode(0, head);
let prev = result;
// prev.next指当前节点, prev.next.next指下个节点
while(prev.next && prev.next.next) {
if (prev.next.val === prev.next.next.val) {
// 标记,待会儿删除当前节点
isDup = true;
// 删除下个节点
prev.next.next = prev.next.next.next;
} else {
// 判断是否需要删除当前节点
if (isDup) {
prev.next = prev.next.next;
isDup = false;
} else {
prev = prev.next;
}
}
}
// 循环结束, 判断是否有需要删除当前节点
if (isDup) {
prev.next = null;
}
return result.next;
};
复制代码
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。