/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
// 总的思想: 先确定能用的头节点(过滤掉很多值),然后 在其后的遍历过程中把把相同值的节点都不连接
// go指针遍历每一个节点, before指针 用于每一次的修改连接,平时的情况(没有相同元素)也是一路向后遍历
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head == nullptr){
return nullptr;
}
if(head->next == nullptr){
return head;
}
ListNode* go = head;
// 找到这样一个头节点: 这个头节点和其后一个节点 的值并不相等
while(go !=nullptr && go->next != nullptr && go->val == go->next->val){
// 每次把相等的一段去掉
while(go !=nullptr && go->next != nullptr && go->val == go->next->val){
go = go->next;
}
go = go->next;
}
if(go == nullptr){
return nullptr;
}
// 此时 go指针指向 开头两个不相同的数 节点
ListNode* go_before = go;
// 确定头
head = go_before;
go = go->next;
bool flag = false;
while(go != nullptr && go->next != nullptr){
// 当有go指针和其后一个节点相同时, 激活falg
if(go->val == go->next->val){
go = go->next;
flag = true;
}else{
if(flag){
// 当flag = true。代表遇到了相同的节点,需要修改指针
go = go->next;
go_before->next = go;
flag = false;
}else{
// 没有相同元素 则两者直接后移就好
go_before = go_before->next;
go = go->next;
}
}
}
if(flag){
go_before->next=nullptr;
}
return head;
}
};