leetcode 82. Remove Duplicates from Sorted List II (线性表)

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

思路:一开始想完后觉得需要用三个指针依次指向链表中的三个元素,但是发现当链表的初始两个元素相同时不好处理,所以就分了情况处理。
1. 初始两个元素相同
2. 初始两个元素不同

ListNode* deleteDuplicates(ListNode* head) 
{
    if(head==NULL || head->next==NULL)
        return head;
    ListNode *r=head,*p=r->next;
    //前两个元素值相同
    while(r!=NULL && p!=NULL && r->val==p->val)
    {
        while(p!=NULL &&r->val==p->val)
        {
            r=p; p=p->next;  
        }
        r=p;
        if(p!=NULL)
            p=p->next;
    }
    head=r;
    if(head==NULL || head->next==NULL)
        return head;
    r=head;p=r->next;ListNode *q=p->next;
    //前两个元素值不同
    while(q!=NULL)
    {
        if(q->val!=p->val)
        {
            r=p; p=q; q=q->next;
        }
        else
        {
            while(q!=NULL &&q->val==p->val)
            {
                p=q; q=q->next;   
            }
            p=q;
            r->next=p;
            if(q!=NULL)
                q=q->next;
        }
    }
    return head;
}

上面这段代码写完感觉太丑了,看了一下别人的思路后,有一个技巧可以使用:在头结点前面人为的添加一个节点,这样只要头结点不为空,肯定能保证最开始的两个节点元素值不同。

ListNode* deleteDuplicates(ListNode* head) 
{
    if(head==NULL || head->next==NULL)
        return head;
    ListNode *pre=new ListNode(0);
    pre->val=head->val-1;
    pre->next=head;
    ListNode *r=pre,*p=r->next,*q=p->next;

    while(q!=NULL)
    {
        if(q->val!=p->val)
        {
            r=p; p=q; q=q->next;   
        }
        else
        {
            while(q!=NULL &&q->val==p->val)
            {
                p=q; q=q->next; 
            }
            p=q;
            r->next=p;
            if(q!=NULL)
                q=q->next;
        }
    }
    return pre->next;
}

还有一种思路是重新建立一个链表,对满足要求的节点进行插入。

猜你喜欢

转载自blog.csdn.net/u012462822/article/details/50858191