码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-12-28 09:42:15      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:tno   ==   元素   class   程序   new   存在   style   删除链表   

题目:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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);
        }
    }
}

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

标签:tno   ==   元素   class   程序   new   存在   style   删除链表   

原文地址:https://www.cnblogs.com/silentteller/p/12110217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!