Poison

82. Remove Duplicates from Sorted List II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyHead = new ListNode(-1, head);
ListNode tail = dummyHead; // 指向最后一个不存在重复值的节点
ListNode curr = head;
while (curr != null) {
if (curr.next == null || curr.next.val != curr.val) {
// 下一个节点为空或者下一个节点值与当前节点值不相同,此时 curr 不存在重复节点,可以加入链表
tail.next = curr;
tail = tail.next;
}

// 跳过值相同的节点,while 退出时 curr 停留在最后一个重复值的节点上
while (curr.next != null && curr.next.val == curr.val) {
curr = curr.next;
}
curr = curr.next; // 此时 curr 再前进一个节点以跳过重复值节点
}

tail.next = null; // 截断链表,因为当链表的最后几个节点值相同时不会再进入 while 循环,所以需要手动截断链表
return dummyHead.next;
}
}
Reference

82. Remove Duplicates from Sorted List II