1. 题目描述
2. 解题思路
一开始按照我的思路,就是同样使用三个指针进行标记,如果cur和next的值一样,那么就使用一个变量去保存这个出现的重复值,然后从cur一直将等于该值的结点删除,如果cur和next不等于,那么三个指针就集体向后移动。
思路很简单,但是当我实际写的时候,发现要处理的边界情况蛮复杂的,因为这个就相当于原地删除,情况很复杂,有兴趣的可以试试。
然后看了题解,重新开辟一个虚拟头节点,使用两个指针进行标记,只要cur和next不想等,那么就将cur连接到虚拟头节点上。
两个代码我都会贴上。
3. 代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head)
{
// 方法一:
// if(head == nullptr) return head;
// ListNode *prev = nullptr, *cur = head, *next = cur->next;
// int n;
// while(cur)
// {
// if(next)
// n = next->val;
// while(cur && cur->val == n)
// {
// if(prev == nullptr)
// {
// head = head->next;
// cur = head;
// if(next)
// next = cur->next;
// if(head == nullptr) return head;
// continue;
// }
// else
// {
// prev->next = next;
// cur = next;
// if(next)
// next = next->next;
// }
// }
// if(cur)
// {
// if(cur->next == nullptr || (next && cur->val != next->val))
// {
// prev = cur;
// cur = next;
// if(next)
// next = next->next;
// if(next == nullptr)
// return head;
// }
// }
// }
// return head;
// 方法二:
if(head == nullptr)
return nullptr;
auto* res = new ListNode(0);
res->next = head;
ListNode* cur = res;
while(cur->next != nullptr && cur->next->next != nullptr){
if(cur->next->val == cur->next->next->val){
int temp = cur->next->val;
while (cur->next != nullptr && cur->next->val == temp)
cur->next = cur->next->next;
}
else
cur = cur->next;
}
return res->next;
}
};