• 用一个提前头节点放在原头节点之前,可以完美解决处理原头节点的情况
  • 两个指针处理:pre代表前一个已经处理完的节点,node代表当前处理节点
  • 当node与之后的节点相同时,则一直后移到最后一位;如果Pre与node相邻,则说明无重复节点,不处理,否则越过node节点
public class Solution {
    public ListNode deleteDuplication(ListNode pHead){
        ListNode head = new ListNode(-1), pre = head, node = pHead;
        head.next = pHead;
        while(node != null) {
            // 跳过重复节点
            while(node.next != null && node.val == node.next.val) {
                node = node.next;
            }
            // 跳过最后一个重复节点
            if(pre.next != node) {
                node = node.next;
                pre.next = node;
            } else {
                pre = node;
                node = node.next;
            }
        }
        return head.next;
    }
}