83. Remove Duplicates from Sorted List
仅供自己学习
思路:
这道题和昨天的题类似,只是上一道把所有重复的元素都删除掉,而这次留下最后一个重复元素。
这里可以想想我们是如何删除所有的重复元素的,我们将重复的元素用一个变量存储,然后从重复的第一个元素遍历后面的元素和这个变量比较,如果相等就去除,我们相当于把所有相同的元素都和这个变量比较然后相等,然后就可以删除所有的重复元素。
我们可以更改上次的代码,来获得这道题的解法。只需要把去除掉变量和while循环,只用一个if来判断时候和下一个元素相等即可,如果相等那么就cur->next=cur->next->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==NULL) 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&&cur->next){ 19 cur->next=cur->next->next; 20 } 21 else cur=cur->next; 22 } 23 return dummy->next; 24 25 } 26 };
还有递归的方法。递归要明确我这个函数用来做什么,然后就将这件事重复n遍,即明确函数定义的功能。这里我们就要去掉重复的元素,那么我们遇到重复的元素应该跳过他,而返回重复元素next后的链表,然后如果相邻元素不相同,我们就让这个元素的next=以下一个元素做参数的函数返回链表。当一个元素等于下一个元素的return 其实是服务于上一个递归的相邻元素不等而next=return中的return。
和上次的题区别也在于用了一个变量来存储重复的元素值,用其他的重复元素值和他对比,然后就能去掉所有的了。
代码:
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==NULL||head->next==NULL) return head; 15 if(head->next->val==head->val){ 16 return deleteDuplicates(head->next); 17 } 18 else{ 19 head->next=deleteDuplicates(head->next); 20 } 21 return head; 22 23 } 24 };

浙公网安备 33010602011771号