题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1、思路分析
熟悉的链表指针问题。n指向头结点,用来保存头结点的位置,同时设置一个pre结点,一开始pre结点和n指向相同的位置,头结点更新完成后,n和pre解除绑定。再来说说重复结点的问题,当前结点p与下一个结点q的值相同时,移动q直至其值不再等于p,再让pre的下一个结点为q,p指向q。
2、代码

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if(pHead == null) return null;
        ListNode p = pHead;
        ListNode n = new ListNode(0);
        ListNode pre = n;
        n.next = pHead;
        boolean flag = false;
        while(p != null) {
            ListNode q = p.next;
            if(q == null) {
                break;
            }
            if(q.val == p.val) {
                while(q != null && q.val == p.val) {
                    q = q.next;
                }
                pre.next = q;
                p = q;
            }
            else {
                if(!flag) { // flag为假表明链表的头结点未更新
                    n.next = p;
                    flag = true;
                }
                pre = p;
                p = q;
            }
        }
        return n.next;
    }
}