剑指Offer-56.删除链表中重复的结点(C++/Java)

题目:

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

分析:

递归思路,若是当前结点和它的next结点的val值不一样,则当前结点能够直接接到已处理完的结点后,继续删除重复的过程;若是当前结点和它的next结点的val值相同,则须要继续遍历,直到找到一个与当前结点val不一样的结点做为新链表的头结点,若是找不到,说明链表全部结点元素都同样,新链表为NULL,不然重新的头结点出发,继续删除重复的过程。指针

非递归思路,新建一个虚拟头结点,若当前结点和它的next结点的val值不一样,意味着不是重复结点,能够加入到已处理完的结点后,若相同,须要找到一个与当前结点不一样的结点,再从新判断。注意遍历结束后要把最后的当前结点加入处处理完结点以后。code

程序:

C++blog

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        if(pHead->val != pHead->next->val){
            pHead->next = deleteDuplication(pHead->next);
            return pHead;
        }
        else{
            ListNode* p = pHead;
            while(p != nullptr && p->val == pHead->val)
                p = p->next;
            return deleteDuplication(p);
        }
    }
};
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        ListNode* dummyHead = new ListNode(0);
        ListNode* p = dummyHead;
        ListNode* curr = pHead;
        while(curr != nullptr && curr->next != nullptr){
            if(curr->val != curr->next->val){
                p->next = curr;
                p = p->next;
            }
            else{
                while(curr->next != nullptr && curr->val == curr->next->val)
                    curr = curr->next;
            }
            curr = curr->next;
        }
        p->next = curr;
        return dummyHead->next;
    }
};

Java排序

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null)
            return pHead;
        if(pHead.val != pHead.next.val){
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        }
        else{
            ListNode p =  pHead;
            while(p != null && p.val == pHead.val)
                p = p.next;
            return deleteDuplication(p);
        }
    }
}
相关文章
相关标签/搜索