82. Remove Duplicates from Sorted List II
仅供自己学习
思路:
直接迭代即可。这里需要建立一个虚拟头节点 dummy以避免对head进行过多处理和一些细节错误。还建立一个cur用来移动,一个temp用来指cur的前一个位置,用来辅助删掉所有重复的节点。
因为要删掉最后一个重复元素,但这时候他的下一个元素已经不相等了,所以我们使用一个标志来判断这个元素是否是重复元素删掉后剩下的最后一个。
然后开始每次判断cur和cur->next的 val 是否相同,如果相同,就将cur->next =cur->next->next,然后标志位flag=1,然后continue,这样就会让重复元素只剩下最后一个,然后我们判断flag是否为1,如果为1说明这个元素是剩下的最后一个重复元素,这时候我们移动temp->next=cur->next,因为我们的temp是紧跟再cur前一个位置,然后cur=cur->next,这样就能把最后一个重复元素删除。
如果这一段没有重复元素我们就 temp=temp->next,cur=cur->next,将两个指针向右移动。
while循环结束后,还要再判断flag是否==1,然后再将这个重复元素去除,这是个边界例子[1,1],因为while的循环条件是 temp->next->next不为空,但是[1,1]这个例子删除一个1后,[1]还存在就结束了while循环,但我们需要把他删除,所以还需要在判断一次flag等于1,就主动把他删掉,在返回dummy->next即可。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* deleteDuplicates(ListNode* head) { 14 if(head==nullptr) return head; 15 ListNode* dummy=new ListNode(0,head); 16 ListNode* cur=dummy->next; 17 ListNode* temp=dummy; 18 int flag=0; 19 while(temp->next->next){ 20 if(cur->val==cur->next->val){ 21 cur->next=cur->next->next; 22 flag=1; 23 continue; 24 } 25 if(flag==1){ 26 temp->next=cur->next; 27 cur=cur->next; 28 flag=0; 29 continue; 30 } 31 temp=temp->next; 32 cur=cur->next; 33 34 } 35 if(flag==1){ 36 temp->next=cur->next; 37 cur=cur->next; 38 flag=0; 39 } 40 return dummy->next; 41 } 42 };
优化,不用temp,但用cur在temp的位置上,操作next和next->next的元素。
如果遇到连续的元素,在if里面再加个while一直循环将cur->next指向连续元素的最后一个元素的下一个元素即可。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* deleteDuplicates(ListNode* head) { 14 if(head==nullptr) return head; 15 ListNode* dummy=new ListNode(0,head); 16 ListNode* cur=dummy; 17 while(cur->next&&cur->next->next){ 18 if(cur->next->val==cur->next->next->val){ 19 int temp=cur->next->val; 20 while(cur->next&&cur->next->val==temp){ 21 cur->next=cur->next->next; 22 } 23 } 24 else{ 25 cur=cur->next; 26 } 27 } 28 29 return dummy->next; 30 } 31 };
还有一种递归的方法,不过得先判断head和head->next不为NULL。
然后判断head和head->next是否相等,如果不等就在进入递归函数,因为这样就能继续返回后面处理掉后面有重复元素的链表了。如果相等那么就定义一个cur=head->next节点,如果cur不为空且cur->val=head->val,那么就cur=cur->next,这样一直到不同的元素,然后将这个不同的元素传入递归函数,这个递归函数就会返回后面处理掉重复元素后的链表。这个函数正在处理重复元素,那么调用这个在处理重复元素的函数的应该是上个递归的head->next=递归函数返回的链表(head->next),所以我们正在处理重复元素的函数返回的会是没有重复元素的链表。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode() : val(0), next(nullptr) {} 7 * ListNode(int x) : val(x), next(nullptr) {} 8 * ListNode(int x, ListNode *next) : val(x), next(next) {} 9 * }; 10 */ 11 class Solution { 12 public: 13 ListNode* deleteDuplicates(ListNode* head) { 14 if(!head||!head->next) return head; 15 if(head->val!=head->next->val){ 16 head->next=deleteDuplicates(head->next); 17 } 18 else{ 19 ListNode* cur=head->next; 20 while(cur&&cur->val==head->val){ 21 cur=cur->next; 22 } 23 return deleteDuplicates(cur); 24 } 25 26 return head; 27 } 28 };

浙公网安备 33010602011771号