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;}
};