欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode82. 删除排序链表中的重复元素 II(未完)

程序员文章站 2022-05-10 19:52:14
...

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

示例 1:

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

示例 2:

输入: 1->1->1->2->3
输出: 2->3
————————————————————————————————————————————————
/**
 * 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) {
        while((head==NULL)||(head->next==NULL)||(head->next->next==NULL)||(head->next->next->next==NULL)||(head->next->next->next->next==NULL))
        {
            return head;
        }
        ListNode *prior=head,*p=head->next,*q=head->next->next;
        while(q!=NULL)
        {
            if(p->val!=q->val)
            {
                prior=prior->next;
            }
            else
            {
                while((p->val==q->val)&&(q!=NULL))
                {
                    p->next=q->next;
                    q=q->next;
                    //prior->next=q->next;
                    //p=q->next;
                    //q=p->next;
                }
                prior->next=q;
            }
            p=p->next;
            q=q->next;
            
        }
        
        if(head->val==head->next->val)
        {
            head=prior->next;
        }
        else
        {
            head->next=prior;
        }
        return head;
        
    }
};

很惨了,昨天早上很快的完成了一个删除1,然后跃跃欲试删除2。结果,被删除2吊打。
首先,难点在于prior节点很难放置,而且很难比较,于是我决定最后倒回来处理头部;
其次,安放好prior后,只考虑了两连续的情况,奇连续的情况没有考虑,比如上例就无法处理奇连续,尤其是前面元素的奇连续;

再次,人不能狂,人一狂,连CSDN都在维护了,吐槽都受到阻碍;

LeetCode82. 删除排序链表中的重复元素 II(未完)

最后,虽然我想到了新方案,但是可以看到“万能公式”被我写的那么长就能看到我已经被逼疯了。
好了,我们期待新代码的诞生。

新代码诞生了,然而可是却,并不是我想的结果,目前还没有想到solution,沮丧。。。

大致思路是这样,有一个三元素窗口,不断滑动,将窗口中间的元素通过比较放入新的链表,头尾特殊情况单独处理。

/**
 * 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) {
        while((head==NULL)||(head->next==NULL))
        {
            return head;
        }
        
        ListNode *prior=head,*p=head,*q=head->next;
        ListNode *list=new ListNode(NULL);
        ListNode *headnode=list;
        
        //处理第一个节点,安置prior
        if((p->val)!=(q->val))
        {
            headnode->next=p;
            headnode=headnode->next;
        }
        p=p->next;
        q=q->next;

        while(q!=NULL)
        {
            if(((p->val)!=(q->val))&&((p->val)!=(prior->val)))
            {
                headnode->next=p;
                headnode=headnode->next;
            }
            prior=prior->next;
            p=p->next;
            q=q->next;
        }
        
        //处理最后一个节点
        if((p->val)!=(prior->val))
        {
            headnode->next=p;
            headnode=headnode->next;
        }
        
         return  list->next;    
    }
};
劳烦各位帮忙找找是何?为何?缘何?



相关标签: LeetCode 删除