删除链表中重复的节点

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

 

 

public static ListNode deleteDuplication(ListNode pHead) {

        

   /*     ListNode first = new ListNode(-1);//设置一个trick

   //所有这些节点变量都是指向同一个链表,都是在操作同一个链表

        first.next = pHead;   //first用于保存链表,因为pHead可能会被删除

 

        ListNode p = pHead;   //用于遍历链表

        ListNode last = first;   //last用于删除重复节点,所以它在p节点前面,

        while (p != null && p.next != null) {

            if (p.val == p.next.val) {

                int val = p.val;

                while (p!= null&&p.val == val)

                    p = p.next;  //p移到了下一个不相等的节点

                last.next = p;//这一步是删除p前面的相等节点

            } else {

                last = p;  //因为p与后一个节点不相等,所以将last移到p处。

                p = p.next;

            }

        }

        return first.next;

       

        */

   

    //利用递归

    if(pHead==null)

        return null;

  //判断一个链表的头和下一个节点,不相等就让头结点的next指向下一个节点的链表的递归

  //相等时就返回第一个不相等的节点的链表

    if(pHead!=null&&pHead.next==null)

        return pHead;

    ListNode current;

    if(pHead.val==pHead.next.val){

        current=pHead.next;

        while(current!=null&&current.val==pHead.val)

            current=current.next;

        return deleteDuplication(current);

    }else{

        current=pHead.next;

        pHead.next=deleteDuplication(current);

        return pHead;

    }

    }

 

}

posted on 2017-12-12 15:40  夜的第八章  阅读(263)  评论(0编辑  收藏  举报

导航