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
- 题目数据保证链表已经按升序排列
方法一:一次遍历
解题思路
- 链表题的通用思路:因为
head
也可能被删除,一般都会创建一个虚拟的头dummy
,返回dummy.next
。 - 因为链表是升序,所以可以直接遍历链表。遇到重复数字则删除这两个节点,记录重复数字并继续向后遍历,看后续的节点是否等于这个重复数字,如果相等则继续删除。
参考代码
public ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(101, head);
ListNode pre = dummy;
while (pre.next != null && pre.next.next != null) {
if (pre.next.val == pre.next.next.val) {
int val = pre.next.val;
// 删除这两个节点,并继续向后遍历
pre.next = pre.next.next.next;
while (pre.next != null && pre.next.val == val) {
pre.next = pre.next.next;
}
} else {
pre = pre.next;
}
}
return dummy.next;
}