剑指offer-删除链表中重复的结点

题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

思路:

​ 模拟,就是操作有点复杂,需要细心

​ 主要思路是设置前后指针一起移动

​ 如果发现cur指针处出现重复,那么一直遍历下去找到未重复的结点,重新链接.

​ 难点在于头部的重复处理.这里选择再添加一个头指针,需要注意的是对于pre指针和cur指针相同,需要特殊处理

​ 举例一:1 1 2 此时,pre在第一个1,cur在第二个1

​ 如果这个头没有处理,最后还是1 1 2

​ 举例二:1 1 1 2 此时,pre在第一个1,cur在第二个1

​ 如果这个头没有处理,最后是1 2

​ 因此这里的做法是若pre和cur相同,则在cur后在添加一个相同的结点,避免出现举例一的情况.

code

public ListNode deleteDuplication(ListNode pHead)
{
    ListNode pre=pHead;
    if(pre==null) {
        return pHead;
    }
    ListNode cur=pHead.next;
    if(cur==null) {
        return pHead;
    }
    ListNode head=new ListNode(-1);
    head.next=pre;
    boolean flag=false;
    if(pre.val==cur.val) {
        flag=true;
        ListNode newNode=new ListNode(pre.val);
        newNode.next=cur.next;
        cur.next=newNode;
    }
    while(cur!=null) {
        if(cur.next!=null&&cur.val==cur.next.val) {
            while(cur.next!=null&&cur.val==cur.next.val) {
                cur=cur.next;
            }
            cur=cur.next;
            pre.next=cur;
        } else {
            pre=pre.next;
            cur=cur.next;
        }
    }
    head=head.next;
    if(flag) {
        head=head.next;
    }
    return head;
}