删除链表中重复的结点

offer_56

概要:删除链表中重复的结点

题目描述:

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

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {

        if(pHead == null || pHead.next == null) return pHead;
        //防止头结点被删掉,要创建一个新的结点指向头结点
        //相当于在原来的链表上多加了一个结点放在头结点的前边
        ListNode head =  new ListNode(0);
        head.next  = pHead;
        
        
        //前结点
        ListNode pre = head;
        //当前结点
        ListNode cur = pHead;
        
        
        //当前结点与当前结点的下一个结点存在
        while(cur != null && cur.next != null)
        {
            if(cur.val == cur.next.val){//如果当前结点的值与当前结点的下一个结点的值相同
            
                //再判断当前结点的下一个结点是否存在,并且当前结点的值与当前结点的下一个结点的值是否相同
                while(cur.next != null && cur.val == cur.next.val){
                    //如果相同,就把当前结点往后移动;直到当前结点的值与下一个结点的值不同才不移动当前结点位置
                    cur = cur.next;
                }
                //已经把与当前结点所有的相同值的结点都划过了,而且当前结点指向的是  与当前结点值相同的结点的 最后一个结点
                //把前结点的值指向换成当前结点的下一个,就相当于删除掉了所有的与当前结点相同的值的结点,并且包含当前结点的值
                pre.next = cur.next;
                //当前结点后移
                cur = cur.next;
            }else{//如果当前结点的值与当前结点的下一个结点的值不同
              //前结点换成当前结点
                pre = cur;
                //当前结点往后移动
                cur = cur.next;
            }
        }
        //因为head是自定义的头结点,要返回原来的链表,应改return的是下一个
        return head.next;
        
    }
}

原文地址:https://www.cnblogs.com/SunAlbert/p/13475382.html