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

题目:

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

分析:

递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程;如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一样,新链表为NULL,否则从新的头结点出发,继续删除重复的过程。

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

程序:

C++

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);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/silentteller/p/12110217.html