- Posted by 微博@Yangsc_o
- 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本题是leetcode,地址:82. 删除排序链表中的重复元素 II
题目
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:输入: 1->1->1->2->3
输出: 2->3
分析
这道题看似简单,但还是有一些特殊情况需要考虑的。
比如,第一个节点和后面的重复,第一个节点也不能保留;中间连续几个都相同时,需要一直往后迭代;
基于这两点,我们需要构造一个哑节点;同时处理好连续相同的情况;
code
public ListNode deleteDuplicates(ListNode head) {
if(head == null) return null;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode left = dummy;
ListNode right = head;
while(right != null && right.next != null) {
int v = right.next.val;
if(v != left.next.val) {
left = left.next;
} else {
//如果left、right指向的节点值相等,就不断移动right,直到left、right指向的值不相等
while(right!=null && right.next!=null && left.next.val==right.next.val) {
right = right.next;
}
left.next = right.next;
}
right = right.next;
}
return dummy.next;
}