82. 删除排序链表中的重复元素 II
题目描述:
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
提示:
- 链表中节点数目在范围
[0, 300]内 -100 <= Node.val <= 100- 题目数据保证链表已经按升序 排列
思路:
- 为了防止头节点就是重复数字的节点这种临界问题,需要设置虚拟节点p。
- 设一个q指针,作用是指向不重复数字的节点,将p的next指向q。
- 比较两个节点的数字:
- 重复时q指向重复的第2个节点,与p.next(此时p.next是重复数字的节点)进行比较,若重复q向后移,直到不重复节点,将p.next指向q,即将重复的节点都跳过。
- 不重复时,p向后移一位,重复步骤3。
步骤3示意图:
/**
* 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) {
if(head == null || head.next == null) return head;
var node = new ListNode(-1);
node.next = head;
var p = node, q;
while(p.next != null) {
if(p.next.next && p.next.next.val == p.next.val) {
q = p.next.next;
while(q && q.val == p.next.val) q = q.next;
p.next = q;
}else {
p = p.next;
}
}
return node.next;
};