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