Leetcode--删除排序链表中的重复元素 II

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:

输入: 1->1->1->2->3
输出: 2->3

思路

使用双指针法解决。

 大概思路:

为了防止头指针出现重复而要删除头指针的情况,在头指针前面设置一个伪头指针来指向头指针,所以后面就用pre->next来跟now的值进行比较;

一些条件判断:

如果pre->next和now的值相等就将now往后推,直到pre->next和now指向的值不同;

在pre->next跟now指向的值不同的情况下,

如果pre->next的下一个是now,说明pre->next没有出现重复值,直接将pre指针往后推;

如果下一个不是now,说明pre->next跟now之间值pre->next的重复值,直接将now赋值给pre->next以删去重复值

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // 边界判断
        if(!head) return head;
       
    //    伪头部,防止头部出现重复的
        ListNode* result= new ListNode(0);
        result->next= head;

        ListNode* pre= result;
        ListNode* now= head;
        while(now){
            if(pre->next->val== now->val){
                now= now->next;
            }
            else{
                // now是pre->next的下一个,直接将pre往后推
                if(pre->next->next== now){
                    pre= pre->next;
                }
                else{
                    // 如果now不是pre->next的下一个,说明之间有重复的,直接将now赋值给pre->next                          
                    pre->next= now;
                }    
            }
        }
        
        // pre->next没到尾部说明尾部出现了重复
        if(pre->next->next)
            pre->next= NULL;
        return result->next;
    }
};
发布了184 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/105231475
今日推荐