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; } }