【剑指Offer】56、删除链表中重复的结点

  题目描述:

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

  解题思路:

  关于链表的大多数题目还是比较简单的,本题也并不太难。

  删除重复结点,也就是如果当前结点和下一个结点的值相同,那么就是重复的结点,都可以被删除,为了保证删除之后的链表的连通性,在删除之后,要把当前结点前面的结点和下一个没有重复的结点链接起来,为此,程序需要记录当前的最后一个不重复结点,即程序中的pre。重点在于:一定要确保当前链接到链表中的一定是不会再重复的结点,具体见代码实现。

  关于第一个结点如果重复怎么办的问题,我们不用单独考虑,可以使用链表中一贯的做法,加一个头结点即可。

  具体思路看代码比较直观,参考如下的代码实现。

  举例:



  编程实现(Java):

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(-1); //方便处理,加一个头结点
        head.next=pHead;
        ListNode pre=head; //已经确保不会重复的最后一个
        ListNode cur=pHead;
        boolean flag=false; //标记是否重复
        while(pre!=null&&cur!=null){
            flag=false;
            while(cur.next!=null && cur.next.val==cur.val){  //重复前进
                cur=cur.next;
                flag=true;
            }
            if(flag && cur!=null) //循环出来后指向最后一个重复的,再进一步
                cur=cur.next;
            //注意此时并不能直接链接,因为下一个是否重复还需要判断
            if(cur==null||cur.next==null||cur.next.val!=cur.val){
                pre.next=cur;
                pre=cur;
                if(cur!=null) //防止空指针
                    cur=cur.next;
            }
        }
        return  head.next;
    }
}

猜你喜欢

转载自www.cnblogs.com/gzshan/p/10887192.html
今日推荐