1.定义一个重读数据窗口的两边,用于删除重复数据 2.为了避免第一第二位即重复,我们可以写逻辑判断,但是为了方便我们定义了一个临时结点放第一位 3.滑动窗口删除重复数据
public ListNode deleteDuplication(ListNode pHead) {
if (pHead == null ) {
return pHead;
}
//辅助头结点(真正头结点前面一个结点)用于避免第一个数字就重读的情况
ListNode tempHeadPre = new ListNode(0);
//当前已遍历的最后一个不重复的结点
ListNode preNoDup = tempHeadPre;
preNoDup.next = pHead;
//当前结点的前面一个结点
ListNode pre = pHead;
//当前结点
ListNode curr = pre.next;
while (curr != null) {
if (curr.val == pre.val) {
while (curr!= null && curr.val == pre.val) {
curr = curr.next;
}
preNoDup.next = curr;
if (curr == null) {
return tempHeadPre.next;
} else {
pre = preNoDup.next;
curr = pre.next;
}
} else {
preNoDup = pre;
pre = curr;
curr = curr.next;
}
}
return tempHeadPre.next;
}