本题主要是考链表的操作,对链表的熟悉度。存数据结构的内容

本题目的关键:题目中说到是排序数组,我们可以根据链表特点找到相等的这一串节点,我们只要2找到最后一个相等的节点就好了。直接把指针移到这个节点后面去,打完收工,不能一个一个的删,但是问题又来了,,,第一个节点和第二个节点相同怎么删啊,,,,构造一个假头贴上去。

本题的首先在链表上比较相邻的节点,一般的操作就是 p 与 p.next 比较,所以假如做一个链表的冒泡也是儒雅随和,不做删除。
但是关键点在于怎么删除节点,之前的题:如何在O(1) 时间内删除指定的链表节点,那里的思路还是比较巧妙的,但是我们这里用不到,我们是要删除相同的,假如 a=b=c,一个一个的删除的话总是有一个删不掉。

public ListNode deleteDuplication(ListNode pHead) {

    if(pHead==null){
        return null;
    }
    ListNode p1=new listNode(0);
    p1.next=pHead;
    ListNode p2=pHead;
    ListNode p3=p1;
    while(p2!=null){
        if(p2.val!==p2.next.val){ // 如果不等于,大家相安无事
            p2=p2.next;
            p1=p1.next;
        }else { // 如果等于
            while(p2.next!=null && p2.val==p2.next.val){ //这里做一个小循环移动,找到最后一个相等节点,但是这个节点也是要被删除的。
                p2=p2.next;
            }
            p1.next=p2.next;//直接划走,本来这里是 p2 的,但是这个 p2 是最后一个相等的数字,也要被带走,所以 p1 直接指向p2 的 next,最后一个相等的数 p2 ***掉
            p2=p2.next;//再移动一下p2,把 p2 移到p2.next 上去
            //这两步后p1和p2 指向同一个地方,但是又是p2向后拓展。
    }
    return p3.next;
}