「这是我参与12月更文挑战的第20天,活动详情查看: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- 题目数据保证链表已经按升序排列
一次遍历
思路
删除重复节点II中,只要是重复出现的元素就直接删除,不再保留任何一个,也就是说只保留唯一出现过一次的元素,当前节点curr等于newHead
- 我们声明一个新的头结点newHead来衔接链表,方便处理边界
既然要重复,那么至少两个节点,所以当前节点的后两个节点,存在的话直接判断是否相等,
-
相等则证明该节点属于重复节点,用变量repeatVal记录下节点的值,后不断更新curr.next为它的下一个值curr.next.next,直到curr.next的值不等于repeatVal,至此,重复元素已删除
-
若不相等则证明curr.next是不重复仅仅出现过一次的元素,curr的指针向后移动,curr = curr.next
最后处理完毕后返回newHead.next即可
var deleteDuplicates = function (head) {
if (!head) return head
var newHead = new ListNode('head',head)
var curr = newHead
while(curr.next&&curr.next.next){
if(curr.next.val===curr.next.next.val){
var repeatVal = curr.next.val
while(curr.next&&curr.next.val===repeatVal){
curr.next = curr.next.next
}
}else{
curr = curr.next
}
}
return newHead.next
};