剑指offer之 删除链表中重复的结点

题目描述

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

思路

  1. 定义一个vector来保存不重复的结点,从初始结点开始,定义两个指针current和next,则判断两个结点的val是否相等,若相等,则next后移,直至找到一个不等于current值的结点,需要注意的是判断current和next是否为NULL,这种方法的缺点是最后一个结点会跳过,因此循环完成后需要再判断一次最后一个结点的值是否重复,通过last_value来判断。最后,将vector中的结点串起来即可
  2. 递归,其实思路类似

代码

方法一

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == NULL)
            return NULL;
        vector<ListNode*> L_node;
        ListNode* current = pHead;
        int last_value;
        while(current != NULL && current->next != NULL)
        {
            ListNode* next = current->next;
            if(current->val!=next->val)
            {
                L_node.push_back(current);
                last_value = current->val;
                current = next;
            }
            else
            {
                while(current->val==next->val)
                {
                    if(next->next == NULL)
                    {
                        next = NULL;
                        break;
                    }
                    else
                    {
                        next = next->next;
                    }
                }
                current = next;
            }
        }
        if(current != NULL && current->val != last_value)
            L_node.push_back(current);
        if(L_node.size() == 0)
            return NULL;
        else
        {
            for(int i = 0; i < L_node.size()-1;i++)
            {
                L_node[i]->next = L_node[i+1];
            }
            L_node[L_node.size()-1]->next = NULL;
            return L_node[0];
        }
    }
};

方法二:

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if (pHead==NULL)
            return NULL;
        if (pHead!=NULL && pHead->next==NULL)
            return pHead;
                 
        ListNode* current;
         
        if ( pHead->next->val==pHead->val){
            current=pHead->next->next;
            while (current != NULL && current->val==pHead->val)
                current=current->next;
            return deleteDuplication(current);                     
        }
         
        else {
            current=pHead->next;
            pHead->next=deleteDuplication(current);
            return pHead;
        }    
    }
};
发布了85 篇原创文章 · 获赞 0 · 访问量 401

猜你喜欢

转载自blog.csdn.net/weixin_38312163/article/details/104810498
今日推荐