public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        // 如果链表首结点为空 或 链表只有一个结点直接返回这个表头
        if(pHead == null || pHead.next == null){
            return pHead;
        }

        // 创建哨兵 head 使得 prev 始终在 cur 前结点
        ListNode head = new ListNode(-1);
        head.next = pHead;
        ListNode prev = head;
        ListNode cur = pHead;

        while(cur != null){
            // 判空不能少 !!! 只要用到 cur.next.val 就要对 cur.next 判空
             if(cur.next != null && cur.val == cur.next.val){
                 // 找到当前重复数字的最后一个结点
                 while(cur.next != null && cur.val == cur.next.val){
                     cur = cur.next;
                 }
                 // 让 prev 指向 最后一个重复的下一个(不重复的)
                  prev.next = cur.next;

                 // 这种情况说明了链表是以重复的结点结尾的,可以直接返回
                 if(cur.next == null){
                     return head.next;
                 }
                 cur = cur.next;
             }else{
                 // 开始我没写 else 导致程序比较凌乱
                 // prev 前移的条件是 当前结点与下一个结点不相同
                 prev = cur;
                 cur = cur.next;
             }    

        }
        return head.next;
    }
}