题目:
解答:
设置一个flag标志 代表当前节点是否是重复节点 如果是重复节点 在删除后续节点后再删除当前节点
代码:
class Solution {
public:
ListNode *deleteDuplicates(ListNode *head) {
//元素是否重复标志
bool flag = false;
//首先处理头节点
while (head)
{
//如果头结点后有节点并且前后值相等
while (head->next != NULL && head->val == head->next->val)
{
//头节点后移
head = head->next;
flag = true;
}
//如果元素重复 移除该元素
if (flag)
{
head = head->next;
flag = false;
}
//如果元素不重复 退出
else
{
break;
}
}
if (head == NULL)
return NULL;
//当前节点的前一节点
ListNode *pre = head;
//当前节点
ListNode *now = head->next;
//当前节点不为空
while (now)
{
//如果当前节点后有节点并且前后值相等
while (now->next != NULL && now->val == now->next->val)
{
//移除后一元素
now->next = now->next->next;
flag = true;
}
//如果有重复元素 移除当前元素
if (flag)
{
pre->next = now->next;
now = pre->next;
flag = false;
}
//如果没有重复 当前元素和前一元素都后移一位
else
{
pre = pre->next;
now = now->next;
}
}
return head;
}
};