leetcode每日一题32

82.删除排序链表中的重复元素

主要问题是没有头节点,以及要删除所有的相等元素,不是留下一个
那么首先要建立一个头节点,指向head
而且指针要始终指向要删除的节点的前一个节点

ListNode* pre = new ListNode(0,head);

在搜索的过程中,如果遇到两个相等的节点a,b,a->next-b,那么保存它们的值x,然后把a删除
也就是让a的前一个节点p->next=b
因为p->next==a && a->next=b
所以p->next->next=b;
所以可以直接写作:
p->next=p->next->next
然后继续往后检查,后续的节点有没有值等于x的
即p->next->val==x
若有,继续让p->next=p->next->next
因为是有序链表,所以直到链表内p的下一个节点指向的值不等于x,就不存在值为x的节点了
当两个相邻节点不相等,p往下指

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* pre=new ListNode(0,head);
        ListNode* p=pre;
        while(p->next&&p->next->next!=nullptr)
        {
            if(p->next->val==p->next->next->val)
            {
                int x=p->next->val;
                while(p->next&&p->next->val==x)
                {
                    p->next=p->next->next;
                }
            }
            else
            {
                p=p->next;
            }
        }
        return pre->next;
    }
};

你可能感兴趣的:(leetcode,算法)