主要问题是没有头节点,以及要删除所有的相等元素,不是留下一个
那么首先要建立一个头节点,指向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;
}
};